通过 Entity Framework 7 插入多行时出错
Getting an error when inserting multiple rows via Entity Framework 7
我有一个简单的 table 和一个简单的生成模型。
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();
为什么我会收到错误消息?
我应该提到我正在使用 Entity Framework 7 和 asp.net 5 / mvc 6。Entity Framework 7 的版本是 "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
P.S。我分析了代码,它生成了以下 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
SQL Entity Framework 7 不支持 Server 2005(事实上 SQL Microsoft 不再支持 Server 2005)。
具体来说,不支持 EF7 使用的多行 INSERT VALUES 语法,它需要 SQL Server 2008 或更新版本。
见https://github.com/aspnet/EntityFramework/issues/3691
您可以通过将 MaxBatchSize 设置为 1 来解决这个问题
我有一个简单的 table 和一个简单的生成模型。
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();
为什么我会收到错误消息?
我应该提到我正在使用 Entity Framework 7 和 asp.net 5 / mvc 6。Entity Framework 7 的版本是 "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
P.S。我分析了代码,它生成了以下 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
SQL Entity Framework 7 不支持 Server 2005(事实上 SQL Microsoft 不再支持 Server 2005)。
具体来说,不支持 EF7 使用的多行 INSERT VALUES 语法,它需要 SQL Server 2008 或更新版本。
见https://github.com/aspnet/EntityFramework/issues/3691
您可以通过将 MaxBatchSize 设置为 1 来解决这个问题