Rob*_*ood 11 .net-4.0 poco entity-framework-4
我开始搞乱EF 4.0因为我对POCO的可能性感到好奇......我想模拟断开连接的web环境并编写以下代码来模拟这个:
问题是当我在上面的Test方法中调用dataContext.SaveChanges时,不会应用更新.当我检查其EntityStateTracker时,testStore实体显示状态为"已修改",但当我在新的dataContext的Stores属性中查看它时,它不再被修改.我原本以为在new dataContext上调用Attach方法也会使对象的"Modified"状态结束,但事实并非如此.有什么我想念的吗?我肯定使用DynamicProxies进行自我跟踪POCO.
private static void SaveTestStore(string storeName = "TestStore")
{
using (var context = new DataContext())
{
Store newStore = context.Stores.CreateObject();
newStore.Name = storeName;
context.Stores.AddObject(newStore);
context.SaveChanges();
}
}
private static Store GetStore(string storeName = "TestStore")
{
using (var context = new DataContext())
{
return (from store in context.Stores
where store.Name == storeName
select store).SingleOrDefault();
}
}
[Test]
public void Test_Store_Update_Using_Different_DataContext()
{
SaveTestStore();
Store testStore = GetStore();
testStore.Name = "Updated";
using (var dataContext = new DataContext())
{
dataContext.Stores.Attach(testStore);
dataContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
}
Store updatedStore = GetStore("Updated");
Assert.IsNotNull(updatedStore);
}
Run Code Online (Sandbox Code Playgroud)
如您稍后所述,您使用的是POCO生成器,而不是自跟踪实体生成器.
我也试过了,变得非常困惑.似乎代理类没有按预期工作,并且可能存在错误.然后又来了.MSDN上没有一个例子尝试这样的东西,当他们在应用程序的不同层引用更新时(我们在这里做的事情),他们使用自我跟踪实体,而不是POCO代理.
我不确定这些代理是如何工作的,但它们确实存在某种状态(我设法在私有属性中找到"已修改"状态).但似乎这个属性完全被忽略了.将属性附加到上下文时,上下文会向ObjectStateManager添加一个条目,并在其中存储更多状态更新.此时,如果您进行更改 - 它将被注册并应用.
问题是当你.Attach一个实体时 - 来自代理的Modified状态不会转移到上下文中的状态管理器.此外,如果您使用context.Refresh(),更新将被覆盖,并被遗忘!即使你将RefreshMode.ClientWins传递给它.我尝试将对象状态的state属性设置为modified,但无论如何它都被覆盖了,并恢复了原始设置.
似乎EF中没有错误,唯一的方法就是使用这样的东西:
using (var db = new Entities())
{
var newUser = (from u in db.Users
where u.Id == user.Id
select u).SingleOrDefault();
db.Users.ApplyCurrentValues(user);
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
Entitity Framework:使用POCO方法在SOA中更改跟踪
似乎POCO不支持您正在寻找的方法,并且正如我所预期的那样,自我跟踪实体是为了解决您正在测试的情况而创建的,而POCO的代理仅在它们创建的上下文中跟踪更改.或者所以它看起来...
小智 5
尝试
db.ObjectStateManager.ChangeObjectState(user, System.Data.EntityState.Modified);
Run Code Online (Sandbox Code Playgroud)
在调用SaveChanges之前