gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:45 25 4
gpt4 key购买 nike

我有这样的模型:

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 对象,它们都有相同的 DocumentType文档编号。在这种情况下,我必须只将其中一个插入数据库并获取新插入的对象 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...
}

关于c# - 管理不同父实体中重复实体的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com