Entity Framework 7을 통해 여러 행을 삽입 할 때 오류가 발생합니다.

asp.net-core-mvc c# entity-framework entity-framework-core

문제

간단한 테이블과 함께 간단한 모델을 만들었습니다.

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 ','. 오류가 발생합니다 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을 사용하고 있음을 언급해야합니다. Entity Framework 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'

PPS 이것은 SQL Server 2005에 대한 것입니다.

수락 된 답변

SQL Server 2005는 Entity Framework 7에서 지원되지 않습니다. 실제로 SQL Server 2005는 Microsoft에서 더 이상 지원하지 않습니다.

특히 EF7에서 사용되는 다중 행 INSERT VALUES 구문은 지원되지 않으며 SQL Server 2008 이상이 필요합니다.

https://github.com/aspnet/EntityFramework/issues/3691을 참조 하십시오.

MaxBatchSize를 1로 설정하면 문제를 해결할 수 있습니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.