使用 Entity Framework (EF),我想从数据库加载一个对象,修改它并将其保存回来。但是,加载和保存发生在不同的上下文中,我通过将另一个对象添加到该对象的集合属性来修改它。
考虑以下基于 famous blog/posts example 的代码来自 MSDN:
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();
}
在我的数据库中,我有 1 个 Blog
对象,其中包含 100 个 Post
。如您所见,我想向此博客
添加一个新的帖子
。不幸的是,在保存之前执行db.Blogs.Attach(blog);
,会抛出一个InvalidOperationException
:“发生了引用完整性约束违规:定义的属性值关系中的主要对象和从属对象之间的引用约束不一致。”
我需要做什么才能让 EF 更新此博客?
更新:
我认为我试图实现的目标(将实体的数据库更新与修改及其相关子实体解耦)是不可能的。相反,我认为现在相反的方向更可行:将子实体的更新/创建与其父实体解耦。这可以通过以下方式完成:
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();
}
最佳答案
您必须将实体附加到上下文,然后更改跟踪应该启动,保存更改将完成剩下的工作。
引用:MSDN Attach Entities to Context
或者尝试显式添加它并直接设置关系所需的信息,而不是通过导航属性,如下所示:
Blog blog;
using (BloggingContext db = new BloggingContext())
{
blog = db.Blogs.Include("Posts").Single();
Post post = new Post {Blog = blog, Title = "Title", Content = "Content"};
post.blogId = blog.Id;
db.Posts.Add(post);
db.SaveChanges();
}
关于c# - 如何在不同的上下文中加载/修改/保存实体对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878525/