想象实体框架中的这对实体:
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只是看起来很荒谬:没有明显的理由这样做,感觉就像是等待中的未来维护问题。更是如此,因为一键保存要求意味着我们在整个代码库中都存在这个问题。有没有其他方法可以解决这个问题?