मैं यह सुनिश्चित करने के लिए पहले परीक्षण करूंगा। प्रदर्शन को उतना बुरा नहीं होना चाहिए।
यदि आपको एक लेन-देन में सभी पंक्तियों को दर्ज करने की आवश्यकता है, तो AddToClassName वर्ग के सभी के बाद इसे कॉल करें। यदि पंक्तियों को स्वतंत्र रूप से दर्ज किया जा सकता है, तो प्रत्येक पंक्ति के बाद परिवर्तन सहेजें। डेटाबेस संगति महत्वपूर्ण है।
दूसरा विकल्प मुझे पसंद नहीं है। यह मेरे लिए भ्रामक होगा (अंतिम उपयोगकर्ता के नजरिए से) अगर मैंने सिस्टम को आयात किया और यह 1000 में से 10 पंक्तियों को अस्वीकार कर देगा, क्योंकि सिर्फ 1 खराब है। आप 10 आयात करने का प्रयास कर सकते हैं और यदि यह विफल रहता है, तो एक-एक करके प्रयास करें और फिर लॉग करें।
अगर इसमें लंबा समय लगता है तो टेस्ट करें। 'प्रॉपर तरीके से' न लिखें। आप इसे अभी तक नहीं जानते हैं। केवल जब यह वास्तव में एक समस्या है, अन्य समाधान (marc_s) के बारे में सोचें।
संपादित करें
मैंने कुछ परीक्षण किए हैं (मिलिसेकंड में समय):
10000 पंक्तियाँ:
SaveChanges () 1 पंक्ति के बाद: 18510,534
SaveChanges () 100 पंक्तियों के बाद: 4350,3075
SaveChanges () 10000 पंक्तियों के बाद: 5233,0635
50000 पंक्तियाँ:
SaveChanges () 1 पंक्ति के बाद: 78496,929
SaveChanges () 500 पंक्तियों के बाद: 22302,2835
SaveChanges () 50000 पंक्तियों के बाद: 24022,8765
तो यह वास्तव में सभी के बाद की तुलना में n पंक्तियों के बाद करने के लिए तेज़ है।
मेरी सिफारिश है:
- SaveRhanges () n row के बाद।
- यदि कोई कमिट विफल रहता है, तो दोषपूर्ण पंक्ति को खोजने के लिए इसे एक-एक करके देखें।
परीक्षण कक्षाएं:
टेबल:
CREATE TABLE [dbo].[TestTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[SomeInt] [int] NOT NULL,
[SomeVarchar] [varchar](100) NOT NULL,
[SomeOtherVarchar] [varchar](50) NOT NULL,
[SomeOtherInt] [int] NULL,
CONSTRAINT [PkTestTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
वर्ग:
public class TestController : Controller
{
private readonly Random _rng = new Random();
private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private string RandomString(int size)
{
var randomSize = _rng.Next(size);
char[] buffer = new char[randomSize];
for (int i = 0; i < randomSize; i++)
{
buffer[i] = _chars[_rng.Next(_chars.Length)];
}
return new string(buffer);
}
public ActionResult EFPerformance()
{
string result = "";
TruncateTable();
result = result + "SaveChanges() after 1 row:" + EFPerformanceTest(10000, 1).TotalMilliseconds + "<br/>";
TruncateTable();
result = result + "SaveChanges() after 100 rows:" + EFPerformanceTest(10000, 100).TotalMilliseconds + "<br/>";
TruncateTable();
result = result + "SaveChanges() after 10000 rows:" + EFPerformanceTest(10000, 10000).TotalMilliseconds + "<br/>";
TruncateTable();
result = result + "SaveChanges() after 1 row:" + EFPerformanceTest(50000, 1).TotalMilliseconds + "<br/>";
TruncateTable();
result = result + "SaveChanges() after 500 rows:" + EFPerformanceTest(50000, 500).TotalMilliseconds + "<br/>";
TruncateTable();
result = result + "SaveChanges() after 50000 rows:" + EFPerformanceTest(50000, 50000).TotalMilliseconds + "<br/>";
TruncateTable();
return Content(result);
}
private void TruncateTable()
{
using (var context = new CamelTrapEntities())
{
var connection = ((EntityConnection)context.Connection).StoreConnection;
connection.Open();
var command = connection.CreateCommand();
command.CommandText = @"TRUNCATE TABLE TestTable";
command.ExecuteNonQuery();
}
}
private TimeSpan EFPerformanceTest(int noOfRows, int commitAfterRows)
{
var startDate = DateTime.Now;
using (var context = new CamelTrapEntities())
{
for (int i = 1; i <= noOfRows; ++i)
{
var testItem = new TestTable();
testItem.SomeVarchar = RandomString(100);
testItem.SomeOtherVarchar = RandomString(50);
testItem.SomeInt = _rng.Next(10000);
testItem.SomeOtherInt = _rng.Next(200000);
context.AddToTestTable(testItem);
if (i % commitAfterRows == 0) context.SaveChanges();
}
}
var endDate = DateTime.Now;
return endDate.Subtract(startDate);
}
}