c# - 如何在不同的上下文中加载/修改/保存实体对象?

标签 c# entity-framework

使用 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/

相关文章:

c# - 仅使用 Azure AD 进行身份验证而不是授权

c# - 当 AutoGenerateColumns 设置为 True 时,如何停止在 DataGrid 中生成特定列?

asp.net-mvc - 在单个事务上包装成员资格提供程序和 dbcontext

sql-server-2005 - 使用 SQL Server 2008 和 SQL Server 2005 以及日期时间

c# - 由于 datetime.now,ModelState.IsValid 始终为 false

c# - 使用 MonoMac 创建一个简单的 Hello World 应用程序

c# - Xamarin iOS 在点击时隐藏占位符

c# - Entity Framework V4 : "Code Only" performance considerations

c# - Linq to Entities - 将 string[] 中带有 TagID 的所有对象插入 ICollection<Tag>

linq - 如何使用linq查询从两个不同的edmx连接两个表