通过实体框架7插入多行时出错



我有一个简单的表和一个简单生成的模型

CREATE TABLE dbo.Admin (
     Id int IDENTITY(1, 1) NOT NULL
    ,DomainLogin nvarchar(50) NOT NULL
    ,CONSTRAINT PK_Admin PRIMARY KEY CLUSTERED (DomainLogin ASC)
)

当我试图通过AddRange方法(下面的代码)添加多个条目时,它会导致错误Incorrect syntax near ','.

var admins = new List<Admin>()
{
    new Admin() {DomainLogin = "zzz1"},
    new Admin() {DomainLogin = "zzz2"},
    new Admin() {DomainLogin = "zzz3"}
};
ctx.Admin.AddRange(admins);
ctx.SaveChanges();

我也尝试过使用Add方法:

ctx.Admin.Add(new Admin() {DomainLogin = "zzz1"});
ctx.Admin.Add(new Admin() {DomainLogin = "zzz2"});
ctx.Admin.Add(new Admin() {DomainLogin = "zzz3"});
ctx.SaveChanges();

然而,如果我保存每个单独的项目,就像下面一样,它是有效的,但正如你所能想象的,当有很多行时,它真的会变慢:

ctx.Admin.Add(new Admin() {DomainLogin = "zzz1"});
ctx.SaveChanges();
ctx.Admin.Add(new Admin() {DomainLogin = "zzz2"});
ctx.SaveChanges();
ctx.Admin.Add(new Admin() {DomainLogin = "zzz3"});
ctx.SaveChanges();

为什么我会出错?

我应该提到的是,我使用的是带有asp.net 5/mvc 6的实体框架7。实体框架7的版本是"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"

附言:我分析了代码,它生成了以下SQL,不出所料,它会给出相同的错误:

exec sp_executesql N'SET NOCOUNT OFF;
INSERT INTO [Admin] ([DomainLogin])
OUTPUT INSERTED.[Id]
VALUES (@p0),
(@p1),
(@p2);
',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 nvarchar(4000)',@p0=N'zzz1',@p1=N'zzz2',@p2=N'zzz3'

p.p.S这是针对SQL Server 2005 的

Entity Framework 7不支持SQL Server 2005(事实上,Microsoft不再支持SQL Server 05)。

特别是,EF7使用的多行INSERT VALUES语法不受支持,它需要SQL Server 2008或更新版本。

请参阅https://github.com/aspnet/EntityFramework/issues/3691

您可以通过将MaxBatchSize设置为1 来解决此问题

最新更新