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

时间:2015-05-20 11:46:27

标签: c# .net entity-framework entity-framework-5

我有这样的模特:

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并设置为父{q} EntityThirdId,当然还要将此实体的状态更改为Detached

到目前为止,非常好。

问题是:

如果,EntityFirstEntitySecondEntityThird个对象,它们都具有相同的DocumentTypeDocumentNumber,那该怎么办?在这样的sutuation中,我必须只将其中一个插入数据库并获取新插入的对象Id。然后将两个实体中的EntityThirdId值设置为此Id

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题。

目前,我已经说过两个实体,当然还有堆中的两个对象。因此,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...
}