【发布时间】:2015-09-09 00:01:57
【问题描述】:
这是我的模型:
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 实体时,我必须使用分离的实体,通过传递对上下文的引用我无法看到它。
我的问题是Place 和AddressLine 是新的,但AddressLineType 已经存在。
当我尝试保存 Place 实体时,即使设置了 AddressLineType ID 属性,因为它已分离,EF 会将其作为新实体插入,从而复制现有的 AddressLineType 条目。
我已经进行了一些研究以尝试解决它,并发现一篇文章建议最好的方法是将AddressLineType 添加为 null 并设置外键属性,这将提供所需的行为。该示例是一对多关系,但我在这里看不到如何为多对多关系执行此操作。
我只是使用实体框架的命名约定来理解映射(我并没有真正接触数据库)。当我建立一对多关系时,我可以看到它会自动添加一个外键,但这在多对多关系中如何工作?
理想情况下,我希望在创建Place 的代码中对这个问题进行排序,但我尝试在保存代码中执行以下操作。它不会添加重复数据,但会引发异常,因为 AddressLineTypes 已经存在。
foreach( var v in place.AddressLines)
{
foreach (var v2 in v.AddressLineTypes)
{
db.AddressLineTypes.Attach(v2);
}
}
在将断开连接的实体添加到上下文并保存之前,如何在断开连接的实体中显示关系?
【问题讨论】:
标签: c# entity-framework entity-framework-6