6

我首先使用 entityframework 5 代码,我有一个这样的模型。

class Product {
    public Product() {
        Fabrics = new BindingList<FabricLineItem>();
    }
    ...
    public virtual ICollection<FabricLineItem> Fabrics { get;set; }
}

class FabricLineItem {
    [ForeignKey("Fabric")]
    public int FabricId { get; set; }  
    public virtual Product Product { get;set; }
    public virtual Fabric Fabric { get;set; }  
}

class Fabric {
    ...
}

我的数据库中已经有织物。我创建了一个新的产品对象并将一些 fabriclineitems 添加到集合中。当我尝试保存产品时,它会复制数据库中的结构并在调用后将其引用到新的

 DataContext.SaveChanges(); 

在调用 savechanges 之前,调试器中的值在调用之后是否正确?知道为什么我会出现这种奇怪的行为吗?

4

3 回答 3

11

我还遇到了 EF 在要添加到数据库的另一个新对象中引用该项目时无法识别该项目已经存在的问题。

@NeilThompson 给了我上面如何解决这个问题的线索:

您需要将现有实体附加到上下文,以便它知道它已经存在:

例如:

context.Fabrics.Attach(product.Fabric); 
context.Products.Add(product);
context.SaveChanges();

return organisation;

我从这里得到这个:

“如果你有一个你知道数据库中已经存在但当前没有被上下文跟踪的实体,那么你可以告诉上下文使用 DbSet 上的 Attach 方法跟踪实体。实体将处于未更改状态上下文。”

http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

于 2014-03-13T19:55:31.573 回答
6

我怀疑上下文不知道 Fabrics 不是新项目 - 所以它添加/插入它们。

如果您将面料附加到 DataContext(作为 Unchanged/NotModified) - 或从数据库中选择它们,那么当调用 SaveChanges() 时,上下文知道现有的 Fabric 对象,然后可以为新的 FabricLineItem 创建导航关系而无需创建一种新面料

EF 比它看起来要“笨”得多——你真的需要告诉它几乎所有的东西。

于 2013-03-14T08:37:22.053 回答
0

根据评论中的其他信息:您需要将 FabricLineItemID(主键)添加到您的 FabricLineItem 类/实体并删除 FabricId(EF 将为您创建一个外键)。当你创建一个新的 FabricLineItem 时,要与一个 Product 关联,从数据库中获取一条 Fabric 记录,然后将其与新创建的 FabricLineItem 关联,然后获取该产品并将其与 FabricLineItem 关联。您无需在 Product 的构造函数中创建新列表,其余的由 EF 完成。

于 2013-03-13T19:37:46.873 回答