如何解决EF 6工作单元存储库:IEntityChangeTracker的多个实例不能引用一个实体对象
我使用的是工作单位存储库模式,使用Unity依赖注入将DataContext注入存储库中
我不断 IEntityChangeTracker的多个实例不能引用一个实体对象。 当我使用其他存储库查找对象以获取外键时,
例如,我的风险对象具有RiskType, 如果我将RiskTypeId设置为1,则对象将保存 如果我设置 RiskTypeId = 1; RiskType = RiskTypeRepo.GetById(1); 然后我得到 一个IEntityChangeTracker的多个实例不能引用一个实体对象
我在这里注册DI
public static void RegisterComponents()
{
UnityContainer container = new Unity.UnityContainer();
container.EnableDiagnostic();
var context = new EveModel();
container.RegisterType<IRiskRepository,RiskRepo>(new InjectionConstructor(context));
container.RegisterType<IRiskService,RiskService>();
//GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver( container);
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
}
//here is the repo constructor and Save method
public abstract class Repository<TEntity> : IRepositoryBase<TEntity> where TEntity : AbstractBase,new()
public Repository(EveModel injectedContext)
{
_context = injectedContext;
this.currentTime = DateTime.Now;
System.Data.Entity.SqlServer.SqlProviderServices.UseScopeIdentity = false;
}
public async Task<TEntity> SaveAsync(TEntity obj)
{
try
{
//_context.Configuration.AutoDetectChangesEnabled = false;
TEntity exist = await _context.Set<TEntity>().FindAsync(obj.Id);
if (exist != null)
{
_context.Entry(exist).CurrentValues.SetValues(obj);
await _context.SaveChangesAsync();
}
else
{
///_context.Entry(obj).State = EntityState.Added;
_context.Set<TEntity>().Attach(obj);
await _context.SaveChangesAsync();
_context.Entry(obj).Reload();
exist = await _context.Set<TEntity>().FindAsync(obj.Id);
}
return exist;
}
catch (Exception ex)
{
throw ex;
}
}
}
解决方法
要确保共享数据库上下文的同一实例(以避免发生此异常),请将数据库上下文也添加到容器中。
UnityContainer container = new UnityContainer();
container.EnableDiagnostic();
container.RegisterType<EveModel>();
container.RegisterType<IRiskRepository,RiskRepo>(); // no need in InjectionConstructor parameter as Unity will resolve eveModel instance automatically
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。