Я использую EF 4.1 в проекте MVC 3, и у меня возникают проблемы с вставкой объекта. Я также использую сессию, чтобы удерживать некоторые объекты. В бетоне:
У меня есть простой класс с отношениями родитель-потомок:
public class Event
{
public User Promotor {get;set;}
}
Промотор основан на CurrentUser. В моем приложении я храню 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? Это приведет к «утечке» кода из БД в мое приложение. Я хочу держать вещи БД в слое данных. Я использую репозиторий, как это:
public void Save(T entity)
{
dbContext.Entry(entity).State = IsPersistent(entity) ?
EntityState.Modified : EntityState.Added;
dbContext.SaveChanges();
}