不能将实体添加到DbContext

时间:2014-11-18 16:21:43

标签: c# entity-framework

我正在尝试将实体从一个{​​{1}}复制到另一个DbContext。 所以我在调用另一个DbContext的保存方法之前加载和分离实体。

修改

首先,我正在加载具有UserDT ID的实体,然后我将其与旧版DbContext分开。 最后,我设置SET IDENTITY_INSERT tUsers ON,保存实体,然后转为SET IDENTITY_INSERT tUsers OFF

var userEntity = DataContext.GetById<User>(id);
DataContext.EnsureDetached(userEntity);
offlineContext.ToggleIdentityInsert(true, typeof(User));
offlineContext.SetSaved(userEntity);
offlineContext.SaveChanges();
offlineContext.ToggleIdentityInsert(false, typeof(User));

DbContext.SaveChanges()之前我调用此方法(请注意此方法属于继承自DbContext的类):

public T SetSaved<T>(T obj) where T : class, IEntity
{
    var isNew = base.Set<T>().All(t => t.Id != obj.Id);
    T ret = default(T);
    var entry = Entry(obj);
    if (isNew)
    {
        entry.State = EntityState.Added;
        ret = base.Set<T>().Add(obj);
    }
    else
    {
        entry.State = EntityState.Modified;
    }
    return ret;
}

到目前为止我使用的所有实体都使用这种方法。

我们的User实体在调用此方法时会导致NullReferenceException,因为属性CurrentValuesOriginalValues会抛出InvalidOperationException,表示该实体未附加到当前DbContext

遇到此问题,我可以访问State,然后将obj添加到DbContex

修改

我忘了说上面的代码第二次尝试了。在我的场景中,我按下登录按钮,应该复制登录用户(离线数据库)。我第一次收到错误,第二次按下登录按钮一切正常。

你知道我忘记了什么吗?

0 个答案:

没有答案