.NET Entity Framework에서 많은 테이블에 많은 사람들을 삽입하거나 업데이트하는 방법

StackOverflow https://stackoverflow.com/questions/2243618

문제

이것은 매우 분명해야하지만 엔티티 프레임 워크에 관한 무언가가 나를 혼란스럽게하고 있으며 이것을 작동시킬 수는 없습니다.

간단히 말해서, ID 값이 ID 열인 3 개의 테이블이 있습니다 : 사용자 (userId, username) 카테고리 (categoryId, categoryName) contodable (userID, categoryID) 복합재.

엔티티 디자이너 (.NET 4.0) 에서이 테이블을 가져 오면 조인 테이블이 나타나지 않지만 사용자와 카테고리는 관계를 보여줍니다. 다음 코드 :

var _context = new MyContext();
var myUser = new User();
myUser.UserName = "joe";

var myCategory = new Category();
myCategory.CategoryName = "friends";

_context.Users.AddObject(myUser);  
myUser.Categories.Add(myCategory);

var saved = _context.SaveChanges();

오류를 반환합니다 (데이터베이스에 아무것도 추가되지 않았지만) :

An item with the same key has already been added.

저장하기 전에 다음을 추가하면 :

_context.Categories.AddObject(myCategory);
myCategory.Users.Add(myUser);

나는 같은 오류를 받고 DB에 절약 된 것은 없습니다. MyUser와 MyCategory 객체를 연결하려고 시도하기 전에 저장하면 둘 다 저장하지만 두 번째 저장은 오류가 발생하여 조인 테이블에 아무것도 추가되지 않습니다.

Cannot insert the value NULL into column 'UserId', table '...dbo.JoinTable'; column does not  allow nulls. INSERT fails. The statement has been terminated.

나는 얼마나 많은 관계가 삽입되었는지 분명히 이해하지 못하고 있습니다. 내가 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

데이터베이스에 사용자 및 카테고리 엔티티를 추가 한 후 SaveChanges ()에게 전화 한 다음 이들 사이에 연관성을 설정해야합니다.

그러나 여기서 실제 문제는 두 번째 예외입니다. 디버거 내에서 sqlprofiler 또는 ado.net profiler를 보면 두 번째 SaveChanges에서 호출하는 동안 다음과 같이 보입니다.

insert [dbo].[JoinTable]([UserId]) values (@0) select [CategoryId] from
[dbo].[JoinTable] where @@ROWCOUNT > 0 and [UserId] = @0 and [CategoryId] = scope_identity()

공동을 올바르게 프로그래밍 한 경우 (두 열의 복합 PK) 분명히 작동하지 않습니다.

Model Browser를 통해 EntityModel 스토어를 살펴보면 OUNCESTABLE 내부의 CANTERYID 열에 실제로는 userID가 설정되지 않은 상태에서 StoryGeneratedPattern이 ID로 설정되어 있음을 보여줍니다. Composite PK가 존재했을 때 EF가 세대 단계 에서이 작업을 수행 한 이유는 저를 넘어선 것입니다. 이에 대한 버그를 MS에 게시하겠습니다. 그러나 그 동안 생성 후 EDMX/SSDL 파일을 수동으로 편집하여 ID 지정자를 제거 할 수 있습니다. 관절에 대한 EntityType 태그의 속성 태그 아래에서 StoreGeneratedPattern = "Identity"문자열을 찾아 제거하십시오.

변화:

<Property Name="CategoryId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />

에게:

<Property Name="CategoryId" Type="int" Nullable="false" />

그런 다음 코드를 실행하면 쿼리를 훨씬 더 잘 삽입 할 수 있습니다.

insert [dbo].[JoinTable]([UserId], [CategoryId]) values (@0, @1)

다른 팁

내가이 작업을 수행 한 방식은 먼저 엔티티 키로 유효한 카테고리 엔티티를 생성하는 것입니다.

Category myCategory = _context.Categories.First(i => i.CategoryID == categoryIDToUse);

또는 히트를 DB에 저장하기 위해 엔티티를 스터브로 작성하려고 시도 할 수 있습니다.

Category myCategory = new Category{CategoryID = categoryIDToUse };

그런 다음 해당 엔티티를 att 그런 다음 ADD 메소드를 사용하여 사용자 엔티티에 범주를 추가 할 수 있습니다. 이 같은:

myUser.Categories.Add(myCategory);

SaveChanges () 호출. 그것은 나를 위해 일했습니다.

새 부모가 컨텍스트에 추가되면 객체 트리의 모든 객체의 상태가 추가로 변경되어 EF는 그러한 모든 객체를 새 레코드와 함께 저장하려고 시도합니다.

이 링크를 참조하십시오 :http://nileshhirapra.blogspot.in/2012/03/entity-framework-insert-operation-with.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top