我有这样的模特:
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
并设置为父{q} EntityThirdId
,当然还要将此实体的状态更改为Detached
。
到目前为止,非常好。
问题是:
如果,EntityFirst
和EntitySecond
有EntityThird
个对象,它们都具有相同的DocumentType
和DocumentNumber
,那该怎么办?在这样的sutuation中,我必须只将其中一个插入数据库并获取新插入的对象Id
。然后将两个实体中的EntityThirdId
值设置为此Id
。
我该如何解决这个问题?
答案 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...
}