使用实体框架 (EF),我想从我的数据库中加载一个对象,对其进行修改并将其保存回来。但是,加载和保存发生在不同的上下文中,我通过将另一个对象添加到对象的集合属性来修改它。
考虑以下基于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();
}
在我的数据库中,我有 1Blog
个 100Post
秒的对象。如您所见,我想为此添加一个新Post
的Blog
. 不幸的是,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();
}