实体框架在调用savechanges时重复

Ahm*_*med 5 c# entity-framework ef-code-first

我首先使用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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的数据库中已有面料.我创建了一个新的产品对象,并为该集合添加了一些fabriclineitems.当我尝试保存产品时会发生什么,它会复制数据库中的结构并在调用后将其引用到新结构

 DataContext.SaveChanges(); 
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ley 11

我也遇到了EF的问题,即当一个项目在另一个要添加到数据库的新对象中被引用时,该项目已经存在.

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

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

例如:

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

return organisation;
Run Code Online (Sandbox Code Playgroud)

我从这里得到了这个:

"如果您知道某个实体已经存在于数据库中但当前没有被上下文跟踪,那么您可以告诉上下文使用DbSet上的Attach方法跟踪实体.实体将处于Unchanged状态上下文."

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


Nei*_*son 6

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

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

EF看起来很多'笨拙' - 你真的需要告诉它几乎所有东西.