MVC アプリで、リポジトリとすべての EF 関連データをバインドする正しい方法が見つかりません。以下の例では、すべての IRepository に対して新しい DbContext を作成すると、エラーが発生します
エンティティ オブジェクトは、IEntityChangeTracker の複数のインスタンスによって参照できません
このエラーは、エンティティが異なるコンテキストにあるために表示されます。たとえば、コード(エンティティにあります)はエラーを返します
var user = new User();
_userRepository.Insert(user)
var order = new Order();
order.User = user;
_orderRepository.Insert(order)
_unitOfWork.Commit();
私が変われば
kernel.Bind(typeof(DbContext)).ToMethod(context => new DbContext(connectionString));
に
kernel.Bind(typeof(DbContext)).ToMethod(context => new DbContext(connectionString)).InRequestScope();
エラーが発生します
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
別のスレッドで ServiceRepository を使用する場合。
多分誰かが解決策を知っていますか?
var connectionString = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
kernel.Bind(typeof(DbContext)).ToMethod(context => new DbContext(connectionString));
kernel.Bind<IObjectSetFactory>().ToMethod(c => kernel.Get<DbContextAdapter>());
kernel.Bind<IObjectContext>().ToMethod(c => kernel.Get<DbContextAdapter>());
kernel.Bind(typeof(IUnitOfWork)).To(typeof(UnitOfWork));
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
kernel.Bind<IServiceRepository>().To<ServiceRepository>();
public interface IServiceRepository
{
UserDetail GetUser(int id);
User GetUser(string email);
User GetUser(string email, string password);
OrderDetail GetOrder(string id);
IEnumerable<OrderDetail> GetOrders(int userId);
IEnumerable<Product> GetProducts();
UserDetail GetParentUser(string partialEmail);
IEnumerable<UserDetail> GetChildUsers(int parentId);
IEnumerable<Statistic> GetStatisticForCurrentMonth(string ip);
void InsertStatistic(QueueItem queueItem);
void InsertStatistic();
void Commit();
void AddUser(User model);
User AddUser(string firstName, string lastName, string email, string password, string country, int? parentId = null, DateTime? dateStamp = null);
void AddOrder(Order order);
void DeleteUser(int id);
void DeleteUser(string email);
bool OrderManager(PaymentProcessorOrder order, out User newUser, out Order newOrder);
User AuthenticatedUser();
string AuthenticatedUserEmail();
bool ValidateUser(string email, string password);
string GetPassword(string email);
}
public class ServiceRepository : IServiceRepository
{
private readonly IRepository<User> _userRepository;
private readonly IRepository<Order> _orderRepository;
private readonly IRepository<UserDetail> _userDetailRepository;
private readonly IRepository<Statistic> _statisticRepository;
private readonly IRepository<Product> _productRepository;
private readonly IRepository<OrderDetail> _orderDetailRepository;
private readonly IUnitOfWork _unitOfWork;
private static readonly object Locker = new object();
public ServiceRepository(IRepository<User> userRepository, IRepository<Statistic> statisticRepository, IRepository<UserDetail> userDetailRepository, IRepository<Order> orderRepository, IUnitOfWork unitOfWork, IRepository<OrderDetail> orderDetailRepository, IRepository<Product> productRepository)
{
_unitOfWork = unitOfWork;
_userRepository = userRepository;
_statisticRepository = statisticRepository;
_userDetailRepository = userDetailRepository;
_orderRepository = orderRepository;
_orderDetailRepository = orderDetailRepository;
_productRepository = productRepository;
}
//Skip code
}