gpt4 book ai didi

c# - Entity Framework 在多对多关系中重复条目

转载 作者:行者123 更新时间:2023-11-30 16:51:34 26 4
gpt4 key购买 nike

我已经阅读了很多关于多对多 Entity Framework 问题的帖子,这又让我头疼了。

Colaborador 有一个 ICollection of Time and时间有我收藏的 Colaborador

有些人说有必要在上下文中添加之前附加子实体(对我不起作用,Pk 错误)。

我使用的是简单的注入(inject)器,我的上下文是根据请求而定的。

我的关联表是这样映射的:

            HasMany<Time>(c => c.Times)
.WithMany(t => t.Colaboradores)
.Map(ct =>
{
ct.MapLeftKey("ColaboradorId");
ct.MapRightKey("TimeId");
ct.ToTable("Receptor");
});

它在数据库中创建关联表。当我尝试插入 Colaborador(实体)时,我在其列表中添加了一些时间(团队),添加到 DbContext,然后添加到 SaveChanges()。

当我这样做时,它会创建一个新的 Colaborador,正确插入关联表(id),但也会复制时间。

var colaborador = Mapper.Map<ColaboradorViewModel, Colaborador>(colaboradorVm);
List<TimeViewModel> timesVm = new List<TimeViewModel>();
colaboradorVm.TimesSelecionados.ForEach(t => timesVm.Add(_serviceTime.BuscarPorId(t)));

colaborador.Times = Mapper.Map<ICollection<TimeViewModel>, ICollection<Time>>(timesVm);

BuscarPorId 函数执行 Find 方法并返回一个时间。

我发现如果我调用 Add 命令,该实体也会将 child 的状态标记为已添加,但如果我尝试附加时间或将其状态更改为未更改,我会得到一个主要的键错误...

foreach (var item in colaborador.Times)
{
lpcContext.Set<Time>().Attach(item);
//lpcContext.Entry(item).State = EntityState.Unchanged;
}

有什么方法可以告诉 Entity Framework 不要插入特定的子项吗?那么只有主表和关联表被填充了吗?

最佳答案

Mapper.Map 创建新的 Time 对象,这些对象未附加到您的上下文,因此您必须将它们附加为 Unmodified,但附加它们由于重复 PK 而导致另一个错误,因为您的上下文已经在跟踪 Time 实体的原始副本。使用 Find 方法将检索这些跟踪的和本地缓存的实体。

查找并使用已附加到您的上下文的实体:

代替:

colaborador.Times = Mapper.Map<ICollection<TimeViewModel>, ICollection<Time>>(timesVm);

使用:

var times = new List<Time>();
var dbSet = lpcContext.Set<Time>();

foreach( var t in timesVm )
{
var time = dbSet.Find( t.Id );

if( null == time )
{
time = Mapper.Map<TimeViewModel, Time>( t );
}

times.Add( time );
}

collaborador.Times = times;

关于c# - Entity Framework 在多对多关系中重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740218/

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