Как предотвратить повторное введение объектов другого DBContext?
-
25-10-2019 - |
Вопрос
Я использую EF 4.1 в проекте MVC 3, и у меня проблемы с вставкой объекта. Я также использую сеанс, чтобы удержать некоторые объекты. В бетоне:
У меня простой класс с родительскими отношениями:
public class Event
{
public User Promotor {get;set;}
}
Промотор основан на CurrentUser. В своем приложении я храню текущего обучения в сеансе http. Теперь, когда я добавляю подобное событие, пользователь (и все связанные объекты) вставляется еще раз с новым первичным ключом.
//1st request inserts/loads the user
User user;
using (var context = new MyDbContext())
{
user = new User();
context.Users.Add(user);
context.SaveChanges();
}
//2nd request saves the event
var before = db.Users.Count();
var @event = new Event
{
Promotor = user, //user was kept in Session
};
db.Entry(@event).State = EntityState.Added;
db.SaveChanges();
Когда я проверяю состояние пользователя, это также «добавлен», хотя первичный ключ не 0, а EF должен знать, что он уже настойчив. Как исправить это, не добавляя многое в мой код настойчивости. Должен ли я переехать мой текущий обучение в новый DBContext по каждому запросу? Это приведет к «утечке кода БД» в мое приложение. Я хочу сохранить DB -материал в слое данных. Я использую подобное хранилище:
public void Save(T entity)
{
dbContext.Entry(entity).State = IsPersistent(entity) ?
EntityState.Modified : EntityState.Added;
dbContext.SaveChanges();
}
Решение
Как вы уже упоминали сами, привлечение пользователя в ваш текущий контекст должен решить проблему. Единственный другой способ, о котором я знаю, - это еще раз извлечь объект в вашем контексте на основе первичного значения ключа.