通过填充的导航属性防止保存重复项的EF默认行为

时间:2015-11-13 10:07:11

标签: c# entity-framework

想象实体框架中的这对实体:

public class Price
{
  public virtual Document Document { get; set; }
  public int DocumentId { get; set; }
  //stuff
}

public class Document
{
    public int DocumentId { get; set; }
    //stuff
}

众所周知,如果在此配对中填充Document对象,它可能会导致现有对象的重复,如下所述:Entityframework duplicating when calling savechanges - 解决方案是仅在保存之前填充关键字段。

但是,请考虑创建新对象时的这种情况。

Price price = repository.GetPriceById(1);
Document doc = new Document();

现在该文档没有Id,因为DocumentId字段是IDENTITY并且尚未发送到数据库 - 它只是一个虚拟的内存中对象。我不能得到它的ID,除非我保存它,我不想这样做:要求是一键保存,而不是部分保存的部分保存。因此,如果我想将它附加到Price对象,那么除了将它直接分配给Document属性之外,我无法进行该关联。如果我将它保存在那个状态,我会得到一份副本。

所以当我保存它时,我不得不这样做:

repository.UpdatePrice(price.Document);
repository.SaveChanges();

price.DocumentId = price.Document.DocumentId;
price.Document = null;
repository.SaveChanges();

其中设置为null只是看起来很荒谬:没有明显的理由这样做,感觉就像是等待中的未来维护问题。更是如此,因为一键保存要求意味着我们在整个代码库中都存在这个问题。有没有其他方法可以解决这个问题?

0 个答案:

没有答案