asp.net - Entity Framework 如何决定是引用现有对象还是创建新对象?

标签 asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

出于我的好奇心(以及 future 的知识),Entity Framework 5 如何决定何时创建新对象与引用现有对象?我可能只是做错了什么,但似乎时不时地,如果我做一些类似的事情:

using (TestDB db = new TestDB())
{
    var currParent = db.Parents.Where(p => p.Prop == passedProp).FirstOrDefault();
    if(currParent == null) {
         Parent newParent = new Parent();
         newParent.Prop = passedProp;
         currParent = newParent;
    }
    //maybe do something to currParent here
    var currThing = db.Things.Where(t => t.Prop == passedPropTwo).FirstOrDefault();
    currThing.Parent = currParent;
    db.SaveChanges();
}

EF 将在数据库中创建一个新的 Parent,基本上是 currParent 的副本,然后将 currThing 的 Parent_ID 值设置为该副本。然后,如果我再次执行此操作(例如,如果已经有两个父级),它不会创建新的父级,而是链接到第一个父级。我不太理解这种行为,但是在玩了一段时间之后,就像这样:

using (TestDB db = new TestDB())
{
    var currParent = db.Parents.Where(p => p.Prop == passedProp).FirstOrDefault();
    if(currParent == null) {
         Parent newParent = new Parent();
         newParent.Prop = passedProp;
         currParent = newParent;
    }
    //maybe do something to currParent here
    var currThing = db.Things.Where(t => t.Prop == passedPropTwo).FirstOrDefault();
    currThing.Parent = db.Parents.Where(p => p.ID == currParent.ID).First();
    db.SaveChanges();
}

似乎解决了这个问题。是否有任何我应该注意的原因可能会发生这种情况,或者我当时的做法是否有些奇怪?抱歉,我无法更具体地说明确切的代码是什么,我不久前遇到过这个问题并用上面的代码修复了它,所以我没有看到任何理由询问它。更一般地说,EF 如何决定是否引用现有项目而不是创建新项目?仅仅根据ID设置与否?谢谢!

最佳答案

如果您的 DBContext 的特定实例向您提供了该实体的特定实例,那么它将知道它代表数据库中的哪些记录以及您对其所做的任何更改适合数据库中的该(那些)记录。如果您自己实例化一个新实体,那么您需要告诉 DBContext 该记录到底是什么(如果它不是应插入数据库的新记录)。

在特殊场景中,您有多个 DBContext 实例,并且一个实例为您提供了该实体,但您想使用另一个实例来处理和保存该实体,那么您必须使用 ((IObjectContextAdapter)firstDbContext).ObjectContext.Detach() 孤立此实体,然后使用 ((IObjectContextAdapter)secondDbContext).ObjectContext.Parents.Attach() 附加它(或 ApplyChanges()(如果您也在编辑它) - 这将为您调用 Attach)。

在其他一些特殊场景中(您的对象已被序列化和/或您有 self 跟踪实体),可能需要一些额外的步骤,具体取决于您到底想要做什么。

<小时/>

总而言之,如果您的 DBContext 的特定实例“知道”实体的特定实例,那么它将使用该实例,就好像它直接绑定(bind)到该特定行一样数据库。

关于asp.net - Entity Framework 如何决定是引用现有对象还是创建新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697661/

相关文章:

c# - Windows 上的优质 Mono/ASP.NET 开发环境?

html - Bootstrap Carousel 不显示所有缩略图

asp.net-mvc - EntityFramework-连接字符串在哪里?

.net - "Out of band library"到底是什么意思?

c# - 如何将 DropDownList 中的项目设置为默认值?

javascript - 如何在 aspx 页面上制作超链接脉冲(即无休止地淡入淡出)

asp.net-mvc - 将 Expression<Func<T, bool?>> 转换为 Expression<Func<T, bool>>

asp.net-mvc - 为时区敏感应用程序存储 DateTimeOffset

entity-framework - monodevelop Entity Framework 集成

c# - Entity Framework 4.1 DbContext 生成器问题