奇异实体对象不能被具有通用存储库的IEntityChangeTracker的多个实例引用
本文关键字:存储 IEntityChangeTracker 引用 实例 对象 实体 不能 | 更新日期: 2023-09-27 18:00:44
我使用的是EF 5.0,并且有一个通用上下文:
namespace ComTr.Web.BusinessLayer
{
public class GenericRepository<TEntity> : IDisposable where TEntity : ComTrBaseEntity //Use as base class to allow access to base entities properties like modified
{
internal ComTrContext Context;
internal DbSet<TEntity> DbSet;
public GenericRepository()
{
Context = new ComTrContext();
DbSet = Context.Set<TEntity>();
}
public virtual TEntity GetById(object id)
{
return DbSet.Find(id);
}
/// <summary>
/// Edits the specified entity to update. Will attach entity to the context
/// </summary>
/// <param name="entityToUpdate">The entity to update.</param>
/// <returns></returns>
public virtual TEntity Edit(TEntity entityToUpdate)
{
entityToUpdate.Modified = DateTime.Now;
DbSet.Attach(entityToUpdate);
Context.Entry(entityToUpdate).State = EntityState.Modified;
return entityToUpdate;
}
}
}
现在我尝试用以下代码更新单个值:
var ComBookingRespository = new ComBookingRespository();
comBooking= ComBookingRespository.GetById(adventureBookingId);
////Save Token in database
comBooking.PaymentToken = token;
ComBookingRespository.Edit(comBooking);
VS将在以下行停止:
Context.Entry(entityToUpdate).State = EntityState.Modified;
带有以下错误消息:
实体对象不能被IEntityChangeTracker 的多个实例引用
这很奇怪,因为我没有其他引用(正如您所看到的,上下文是新启动的)。我该怎么摆脱这个?
您的错误可能来自PaymentToken实体。
您有一个附加到adventureBooking
的令牌实体。很可能,您使用相同的逻辑,通过不同的通用存储库获得了该实体——您在该存储库中创建了一个上下文并检索了该项目。由于令牌实体附加到您的TokenRepository
,而adventureBooking
实体附加到comBookingRepository
,因此您有两个不同的上下文。要么断开token
实体与其原始存储库的连接,要么使存储库过载以能够传入您的上下文,这样您的上下文就可以在您的repo之间共享。
public GenericRepository(DbContext context)
{
Context = context;
DbSet = Context.Set<TEntity>();
}
然后在你的代码中创建你的回购:
var context = new new ComTrContext();
var ComBookingRespository = new ComBookingRespository(context );
var tokenRepository = new tokenRepository (context );
上下文的另一个实例正在跟踪有问题的实体。