管理不同父实体中重复实体的一般方法

General way for managing duplicate entities in different parent entities

我有这样的模型:

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...
}