EF 6 Репозиторий единиц работы: на объект сущности не могут ссылаться несколько экземпляров IEntityChangeTracker
Я использую шаблон репозитория Unit Of Work, используя Unity Dependacy Inhejection, чтобы ввести 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;
}
}
}
0 ответов
Чтобы обеспечить совместное использование одного и того же экземпляра контекста базы данных (чтобы избежать этого исключения), также добавьте свой контекст базы данных в контейнер.
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