这是我的模特:
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实体,我无法通过传递对上下文的引用来看到它。
我的问题是Place
和AddressLine
是新的,但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);
}
}
在将断开连接的实体添加到上下文并保存之前,如何显示断开连接的实体?
答案 0 :(得分:0)
如果要添加的实体具有对其他实体的引用 尚未跟踪,然后这些新实体也将被添加到 上下文并将在下次插入数据库 调用SaveChanges。