【问题标题】:Saving a new disconnected entity with an existing nested entity without duplicating the existing entity使用现有嵌套实体保存新的断开连接的实体,而不复制现有实体
【发布时间】: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 实体时,我必须使用分离的实体,通过传递对上下文的引用我无法看到它。

我的问题是PlaceAddressLine 是新的,但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


    【解决方案1】:

    您需要手动修改断开连接实体的状态,以便像这样更新记录-

        foreach( var v in place.AddressLines)
        {
            foreach (var v2 in v.AddressLineTypes)
            {
                db.Entry<AddressLineTypes>(v2).State = EntityState.Modified;
            }        
        }
    

    【讨论】:

    • 我没有更新,我正在添加一个新实体,但该实体具有已存在且未更新的嵌套实体,我只想显示关系。当我将现有嵌套实体的实体状态设置为 Unchanged 时,我收到主键已存在的错误
    • 我认为对于嵌套实体,您需要将状态设置为已修改,或者如果您希望它们保持不变,那么您也可以在将主实体添加到 dbcontext 之前将它们设置为 null。
    【解决方案2】:

    如果被添加的实体引用了其他实体 尚未跟踪,那么这些新实体也将添加到 上下文,并将在下一次插入到数据库中 调用 SaveChanges。

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

    【讨论】:

    • 我已经尝试附加它们并将它们的状态设置为Unchanged,但这会导致主键已经存在的错误。
    • 你必须先从数据库中选择记录,然后附加到特定实体,它才会起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2021-07-28
    • 2020-11-28
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多