Как я могу предотвратить повторную вставку EF объектов другого dbcontext? - PullRequest
2 голосов
/ 24 июля 2011

Я использую 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();
    }

1 Ответ

0 голосов
/ 24 июля 2011

Как вы уже упоминали, повторное присоединение пользователя к текущему контексту должно решить проблему. Единственный другой способ, которым я знаю, - это снова получить объект в вашем контексте на основе значения первичного ключа.

...