我先测试一下以确定。性能不必这么差。
如果需要在一个事务中输入所有行,请在所有AddToClassName类之后调用它。如果可以独立输入行,请在每行之后保存更改。数据库一致性很重要。
第二个选择我不喜欢。(从最终用户的角度来看)如果导入到系统,这将使我感到困惑,并且由于1个不好,它将减少1000行中的10行。您可以尝试导入10,如果导入失败,请一个接一个地尝试,然后登录。
测试是否需要很长时间。不要写“适当”。你还不知道。仅当确实存在问题时,才考虑其他解决方案(marc_s)。
编辑
我已经做了一些测试(时间以毫秒为单位):
10000行:
1行后的SaveChanges():18510,534 
100行后的
SaveChanges():4350,3075 10000行后的SaveChanges():5233,0635
50000行
1行后的SaveChanges():78496,929 
500行后的
SaveChanges():22302,2835 50000行后的SaveChanges():24022,8765
因此,实际上在n行之后提交比在所有行中提交要快。
我的建议是:
- n行之后的SaveChanges()。 
 
- 如果一次提交失败,请一一尝试查找有问题的行。
 
测试类别:
表:
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);
    }
}