管理不同父实体中重复实体的通用方法
本文关键字:实体 方法 管理 | 更新日期: 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; }
}
假设我必须将EntityFirst
和EntitySecond
对象插入数据库。但EntityThird
具有一定的唯一性,DocumentType
和DocumentNumber
共同具有唯一性。因此,在调用SaveChanges
之前,我正在检查这样的EntityThird
是否存在于数据库中。如果它存在,那么我将把它的Id
设置为父的EntityThirdId
,当然将这个实体的状态更改为Detached
。
到目前为止,一切顺利。
问题是:
如果EntityFirst
和EntitySecond
有EntityThird
对象,它们都有相同的DocumentType
和DocumentNumber
。在这种情况下,我必须只插入其中一个到数据库中,并获得新插入的对象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...
}