我正在尝试将实体从一个{{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,因为属性CurrentValues
和OriginalValues
会抛出InvalidOperationException
,表示该实体未附加到当前DbContext
。
遇到此问题,我可以访问State
,然后将obj
添加到DbContex
。
修改
我忘了说上面的代码第二次尝试了。在我的场景中,我按下登录按钮,应该复制登录用户(离线数据库)。我第一次收到错误,第二次按下登录按钮一切正常。
你知道我忘记了什么吗?