管理不同父实体中重复实体的通用方法

本文关键字:实体 方法 管理 | 更新日期: 2023-09-27 17:49:52

我有这样的模型:

public class EntityFirst
{
    public int Id { get; set; }
    public int EntityThirdId { get; set; }
    public virtual EntityThird { get; set; }
}
public class EntitySecond
{
    public int Id { get; set; }
    public int EntityThirdId { get; set; }
    public virtual EntityThird { get; set; }
}
public class EntityThird 
{
    public int Id { get; set; }
    // These columns are unique together
    public int DocumentType { get; set; }
    public string DocumentNumber { get; set; }
}

假设我必须将EntityFirstEntitySecond对象插入数据库。但EntityThird具有一定的唯一性,DocumentTypeDocumentNumber共同具有唯一性。因此,在调用SaveChanges之前,我正在检查这样的EntityThird是否存在于数据库中。如果它存在,那么我将把它的Id设置为父的EntityThirdId,当然将这个实体的状态更改为Detached

到目前为止,一切顺利。

问题是:

如果EntityFirstEntitySecondEntityThird对象,它们都有相同的DocumentTypeDocumentNumber。在这种情况下,我必须只插入其中一个到数据库中,并获得新插入的对象Id。然后将两个实体中的EntityThirdId值设置为此Id

我该如何解决这个问题?

管理不同父实体中重复实体的通用方法

我的问题已经解决了。

目前,我在堆中有两个实体,当然还有两个对象。因此,EF试图将两个实体插入数据库。我认为,如果这两个实体将引用相同的地址,那么EF将只插入其中一个。当然,我还需要使另一个实体或实体(在超过2个相同实体的情况下) Detached .

这就解决了我的问题。

作为一个额外的注意,我分享了部分代码,以便其他人可以使用它:

// Here I find all this type of entities which has Added state
var addedEntities = context.Set<TEntity>()
              .Local
              .AsEnumerable();

然后,我检查所有实体,如果有任何其他相同的实体,或者你可以在这里使用GroupBy等根据您的要求

// parent - This is an owner entity
if (addedEntities.Count(x => ...) > 1)
{
    parent.GetType()
          .GetProperty("MyTypeName")
          .SetValue(parent, addedEntities.LastOrDefault(...));
    // Detach your object here...
}