如何防止EF重新插入其他dbcontext的对象?

时间:2011-07-24 09:58:02

标签: entity-framework session entity-framework-4.1 cascade dbcontext

我在MVC 3项目中使用EF 4.1,我在插入对象时遇到问题。我也在使用会话来保留一些对象。具体来说:

我有一个带有父子关系的简单类:

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?这将导致db代码“泄漏”到我的应用程序中。我想将DB内容保存在数据层中。我正在使用这样的存储库:

    public void Save(T entity)
    {
        dbContext.Entry(entity).State = IsPersistent(entity) ? 
            EntityState.Modified : EntityState.Added;
        dbContext.SaveChanges();
    }

1 个答案:

答案 0 :(得分:0)

正如您自己已经提到的,将用户重新连接到当前上下文应该可以解决问题。我所知道的另一种方法是根据主键值在您的上下文中再次检索对象。