EF Code First 实体对象不能被 IEntityChangeTracker 的多个实例引用
EF Code First An entity object cannot be referenced by multiple instances of IEntityChangeTracker
我有一个问题,有很多答案。我得到的异常是:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
当我在网上冲浪并在流页面上堆叠时,我已经达到了 DbContext 的实例在每个 UnitOfWork 中应该只有一个的程度,或者必须分离前一个实例。听起来很有道理!但是,我的问题是我不知道我必须在我的代码(下面发布)中的什么地方进行修改。
我一直在尝试使用通用存储库和工作单元模式以及 EF 代码优先方法。
public abstract class Repository<T> : IRepository<T> where T : BaseEntity
{
protected DbContext EntityContext;
protected readonly IDbSet<T> DbSet;
protected Repository(DbContext context)
{
EntityContext = context;
DbSet = context.Set<T>();
}
public virtual IEnumerable<T> GetList()
{
return DbSet.AsEnumerable();
}
public virtual T Add(T entity)
{
return DbSet.Add(entity);
}
}
通用工作单元:
public sealed class UnitOfWork : IUnitOfWork
{
private DbContext _context;
public UnitOfWork(DbContext context)
{
_context = context;
}
public int Commit()
{
return _context.SaveChanges();
}
private void Dispose(bool disposing)
{
if (!disposing) return;
if (_context == null) return;
_context.Dispose();
_context = null;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
客户端存储库
public class ClientRepository : Repository<Client>, IClientRepository
{
public ClientRepository(DbContext context)
: base(context)
{
}
public override Client Add(Client entity)
{
return DbSet.Add(entity); // <-- Here the exception comes
}
}
这是放置在 'DataGenerator' 项目中的 'GenerateClients' 方法的主要部分。
var countries = container.Resolve<ICountryService>().GetList().ToList();
if (!countries.Any())
{
throw new InvalidDataGeneratorException(Strings.NoCountryToCreateClient);
}
var clientService = container.Resolve<IClientService>();
clientService.Create(new Client
{
Name = "Dell",
CountryId = countries[0].Id,
Country = countries[0],
AddressLineOne = "76-98 Victoria Street",});
这里是使用 ClientRepository 的 ClientService:
public class ClientService : Service<Client>, IClientService
{
IUnitOfWork UnitOfWork { get; set; }
private readonly IClientRepository _clientRepository;
private readonly ICalculatorService _calculatorService;
public ClientService(IClientRepository clientRepository,
IUnitOfWork unitOfWork,
ICalculatorService calculatorService)
: base(clientRepository, unitOfWork)
{
UnitOfWork = unitOfWork;
_calculatorService = calculatorService;
_clientRepository = clientRepository;
}
public override void Create(Client client)
{
_clientRepository.Add(client);
_clientRepository.Save();
}
}
请注意,为了尽量减少问题的长度,一些方法已被删除。
实际上,当我 运行 我的 Console 类型的 Data Generator 项目时,在添加客户端之前,添加了一些国家没有问题,但是当涉及到客户端服务时,它进入 ClientRepository,出现异常。
我不知道应该把修改放在哪里才能避免异常。非常感谢
Client 与国家/地区有关系吗?您是否将其添加为 Client.Country = RELATED_COUNTRY
也许它试图添加同一个国家/地区两次,我通常使用 Client.CountryId = ID_OF_COUNTRY
我有一个问题,有很多答案。我得到的异常是:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
当我在网上冲浪并在流页面上堆叠时,我已经达到了 DbContext 的实例在每个 UnitOfWork 中应该只有一个的程度,或者必须分离前一个实例。听起来很有道理!但是,我的问题是我不知道我必须在我的代码(下面发布)中的什么地方进行修改。 我一直在尝试使用通用存储库和工作单元模式以及 EF 代码优先方法。
public abstract class Repository<T> : IRepository<T> where T : BaseEntity
{
protected DbContext EntityContext;
protected readonly IDbSet<T> DbSet;
protected Repository(DbContext context)
{
EntityContext = context;
DbSet = context.Set<T>();
}
public virtual IEnumerable<T> GetList()
{
return DbSet.AsEnumerable();
}
public virtual T Add(T entity)
{
return DbSet.Add(entity);
}
}
通用工作单元:
public sealed class UnitOfWork : IUnitOfWork
{
private DbContext _context;
public UnitOfWork(DbContext context)
{
_context = context;
}
public int Commit()
{
return _context.SaveChanges();
}
private void Dispose(bool disposing)
{
if (!disposing) return;
if (_context == null) return;
_context.Dispose();
_context = null;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
客户端存储库
public class ClientRepository : Repository<Client>, IClientRepository
{
public ClientRepository(DbContext context)
: base(context)
{
}
public override Client Add(Client entity)
{
return DbSet.Add(entity); // <-- Here the exception comes
}
}
这是放置在 'DataGenerator' 项目中的 'GenerateClients' 方法的主要部分。
var countries = container.Resolve<ICountryService>().GetList().ToList();
if (!countries.Any())
{
throw new InvalidDataGeneratorException(Strings.NoCountryToCreateClient);
}
var clientService = container.Resolve<IClientService>();
clientService.Create(new Client
{
Name = "Dell",
CountryId = countries[0].Id,
Country = countries[0],
AddressLineOne = "76-98 Victoria Street",});
这里是使用 ClientRepository 的 ClientService:
public class ClientService : Service<Client>, IClientService
{
IUnitOfWork UnitOfWork { get; set; }
private readonly IClientRepository _clientRepository;
private readonly ICalculatorService _calculatorService;
public ClientService(IClientRepository clientRepository,
IUnitOfWork unitOfWork,
ICalculatorService calculatorService)
: base(clientRepository, unitOfWork)
{
UnitOfWork = unitOfWork;
_calculatorService = calculatorService;
_clientRepository = clientRepository;
}
public override void Create(Client client)
{
_clientRepository.Add(client);
_clientRepository.Save();
}
}
请注意,为了尽量减少问题的长度,一些方法已被删除。
实际上,当我 运行 我的 Console 类型的 Data Generator 项目时,在添加客户端之前,添加了一些国家没有问题,但是当涉及到客户端服务时,它进入 ClientRepository,出现异常。
我不知道应该把修改放在哪里才能避免异常。非常感谢
Client 与国家/地区有关系吗?您是否将其添加为 Client.Country = RELATED_COUNTRY
也许它试图添加同一个国家/地区两次,我通常使用 Client.CountryId = ID_OF_COUNTRY