Entity Framework (EF)를 사용하면 데이터베이스에서 개체를로드하고 수정 한 다음 다시 저장하려고합니다. 그러나로드 및 저장이 다른 컨텍스트에서 발생하고 개체의 컬렉션 속성에 다른 개체를 추가하여 개체를 수정합니다. 나는 100 Post
의 1 Blog
개체가 내 데이터베이스에서다른 컨텍스트에서 엔티티 개체를로드/수정/저장하는 방법?
Blog blog;
using (BloggingContext db = new BloggingContext())
{
blog = db.Blogs.Include("Posts").Single();
}
// No one else knows the `post` object directly.
{
Post post = new Post {Blog = blog, Title = "Title", Content = "Content"};
blog.Posts.Add(post);
}
using (BloggingContext db = new BloggingContext())
{
// No idea what I have to do before saving...
// Can't do anything with `post` here, since this part will not know this
// object directly.
//db.Blogs.Attach(blog); // throws an InvalidOperationException
db.SaveChanges();
}
:
은 다음 MSDN에서 famous blog/posts example에 따라 코드를 살펴 보자. 보시다시피이 Blog
에 새 Post
을 추가하고 싶습니다. 아쉽게도 db.Blogs.Attach(blog);
을 저장하기 전에 InvalidOperationException
: "참조 무결성 제약 조건 위반이 발생했습니다 : 참조 제약 조건을 정의하는 속성 값이 관계의 주체 및 종속 개체간에 일치하지 않습니다."라는 메시지가 나타납니다.
EF에서이 블로그를 업데이트하려면 어떻게해야합니까?
는 UPDATE :
나는 (수정 및 관련 하위 개체에서 개체의 데이터베이스 업데이트 디커플링) 달성하려고 수 없습니다 무슨 생각합니다. 대신, 나는 부모 개체에서 하위 엔티티의 업데이트/생성을 분리하는 반대 방향을 더 실현 가능한 것으로 생각한다. 이것은 다음과 같은 방법을 수행 할 수 있습니다
Blog blog;
using (BloggingContext db = new BloggingContext())
{
blog = db.Blogs.Single();
}
Post post = new Post {BlogId = blog.BlogId, Title = "Title", Content = "..."};
using (BloggingContext db = new BloggingContext())
{
db.Posts.Add(post);
db.SaveChanges();
}
블로그를'db.Blogs '로 두 번째 컨텍스트에 첨부 할 때.첨부 (블로그);'InvalidOperationException'이 발생했습니다 : * 참조 무결성 제약 조건 위반이 발생했습니다 : 참조 제약 조건을 정의하는 속성 값이 관계에있는 주체 및 종속 개체간에 일치하지 않습니다 *. 게시 한 링크는 막연하게 관련되어 있습니다. –
그런 다음 "어려운"방법을 시도해보십시오. 블로그는 게시물과 일대 다 관계를 맺습니다. 그러면 게시물에는 부모임을 알기 위해 blogId와 같은 필드가 포함됩니다. 그런 다음 블로그의 탐색 속성 모음에 게시물을 추가하는 대신 해당 ID를 설정하고 두 번째 컨텍스트 범위에서 명시 적으로 추가 작업을 수행하십시오. – dutzu
이것은 다소 효과가 있지만 두 번째'using' 문에서'post'를 액세스 할 수있을 때에 만 작동합니다. 이것이 내가 피하려고하는 것이지만, 적절한 절충 일 수 있습니다. –