Как предотвратить повторное введение объектов другого DBContext?

StackOverflow https://stackoverflow.com/questions/6806136

Вопрос

Я использую 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();
    }
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top