管理不同父实体中重复实体的一般方法
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; }
}
假设我必须将 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...
}
我有这样的模型:
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...
}