gpt4 book ai didi

c# - 如何将现有实体附加到通用的 Entity Framework 上下文?

转载 作者:行者123 更新时间:2023-11-30 17:32:28 24 4
gpt4 key购买 nike

我想在 Entity Framework 6 中加载一个带有 AsNoTracking 和 LazyLoadingEnabled = false 的实体。在某些特殊情况下,我想显式地重新加载一些集合。如何显式加载分离实体的集合?

我正在寻找一个通用选项,以将现有实体附加到上下文。

我的电话是这样的:

var myCar = await this.myCarRepositoryAccessor.GetById(this.UnitOfWork, 1).ConfigureAwait(false);
this.UnitOfWork.LoadCollection(myCar, e => e.Driver);

DataRepository 中的 GetById 看起来像这样:

public Task<TEntity> GetById(int id)
{
return id == 0
? Task.FromResult(default(TEntity))
: this.Context.InternalSet<TEntity>().AsNoTracking()?.SingleOrDefaultAsync(p => p.Id == id);
}

UnitOfWork 中的 LoadCollection 看起来像:

public void LoadCollection<TEntity, TElement>(TEntity entity, Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) where TEntity : class, IEntity where TElement : class
{
//this.context.Entry(entity).State = EntityState.Unchanged
this.context.Entry(entity).Collection(navigationProperty).Load();
}

我试图将实体状态设置为 Unchanged 但我收到此错误消息:

Attaching an entity of type 'MyCar' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

最佳答案

我猜这是因为 AsNoTracking(),显式加载不适用于它。

如果你想使用显式加载,你应该从你的 getbyid 方法中删除它。

另请注意,您可以将字符串与集合一起使用,这样您就可以简单地使用字符串或字符串列表来代替附加函数,以防您要加载多个导航。

还很高兴知道,对于集合,您应该使用集合,而对于单个实体导航,您应该使用引用

您可以做的最好的事情是将另一个参数添加到您的 getbyid 字符串列表中,并包含该列表中的所有字符串,因为包含也接受字符串。

关于c# - 如何将现有实体附加到通用的 Entity Framework 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46647931/

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