使用现有嵌套实体保存新的断开连接的实体,而不复制现有实体

时间:2015-09-09 00:01:58

标签: c# entity-framework entity-framework-6

这是我的模特:

public class Place
{
    public int ID { get; set; }
    public virtual ICollection<AddressLine> AddressLines { get; set; }
}
public class AddressLine
{
    public int ID { get; set; }
    public int Order { get; set; }
    public string Value { get; set; }
    public virtual Place Place { get; set; }
    public virtual ICollection<AddressLineType> AddressLineTypes { get; set; }  
}
public class AddressLineType
{
    public int ID { get; set; }
    public string Value { get; set; }
    public virtual ICollection<AddressLine> AddressLines { get; set; }

}

当使用EF6创建一个新的Place实体时,我必须使用一个dettached实体,我无法通过传递对上下文的引用来看到它。

我的问题是PlaceAddressLine是新的,但AddressLineType已经存在。

当我尝试保存Place实体时,即使设置了AddressLineType ID属性,因为它已分离,EF会将其作为新实例插入,从而复制现有的AddressLineType条目。

我做了一些研究试图绕过它并找到一篇文章,建议最好的方法是将AddressLineType添加为null并设置外键属性,这将给出所需的行为。这个例子是一对多的关系,但我不知道如何为这里的多对多关系做到这一点。

我只是使用实体frameowrk的命名约定来理解映射(我并没有真正触及数据库)。当我做一对多的关系时,我可以看到它会自动添加一个外键,但这在多对多的关系中是如何工作的?

理想情况下,我希望在创建Place的代码中对此问题进行排序,但我尝试在保存代码中执行以下操作。它不会添加重复数据,但会抛出异常,因为AddressLineTypes已经存在。

foreach( var v in place.AddressLines)
{
    foreach (var v2 in v.AddressLineTypes)
    {
        db.AddressLineTypes.Attach(v2);
    }

}

在将断开连接的实体添加到上下文并保存之前,如何显示断开连接的实体?

1 个答案:

答案 0 :(得分:0)

  

如果要添加的实体具有对其他实体的引用   尚未跟踪,然后这些新实体也将被添加到   上下文并将在下次插入数据库   调用SaveChanges。

https://msdn.microsoft.com/en-in/data/jj592676.aspx