我遇到了一个我认为很容易解决的问题。 这是我的场景(实体框架4使用自我跟踪断开了实体)。 假设我有2个实体:用户,订单。 从asp.net页面获取数据库1用户和1个订单。
const int userId = 1;
const int orderId = 1;
var userManager = new UserManager();
var orderManager = new OrderManager();
var user = userManager.GetUser(userId);
var order = channelManager.GetChannel(channelId);
user.Orders.Add(order);
现在我需要创建一个更新用户添加订单的功能。
我写了类似的东西:public bool UpdateUser(User user)
{
context.AttachTo("Users", user);
var stateMgr = context.ObjectStateManager;
var stateEntry = stateMgr.GetObjectStateEntry(user);
for (int i = 0; i < stateEntry.CurrentValues.FieldCount; i++)
{
bool isKey = false;
string name = stateEntry.CurrentValues.GetName(i);
foreach (var keyPair in stateEntry.EntityKey.EntityKeyValues)
{
if (string.Compare(name, keyPair.Key, true) == 0)
{
isKey = true;
break;
}
}
if (!isKey)
{
stateEntry.SetModifiedProperty(name);
}
}
context.ApplyCurrentValues("Users", user);
return context.SaveChanges() > 0;
}
我对此函数没有任何错误,调试一切似乎都没问题,但是当我检查数据库时,实体没有按预期更新。 我认为更新一个断开连接的实体是一件简单但显然不是。 有人可以解释一下用EF4更新断开对象的整个图形之间的逻辑吗?如果你能,我需要找不到逻辑,没有一系列链接可供查看。我已经花了一些时间在互联网上看,但我找到了很多approches,我不确定哪一个是正确的。
由于
答案 0 :(得分:1)
我没有在代码中看到与自我跟踪实体相关的任何内容。无论如何,使用ASP.NET don't work very well。
你的代码应该是什么?看起来你想要这样做:
public bool UpdateUser(User user)
{
context.AttachTo("Users", user);
context.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);
return context.SaveChanges() > 0;
}
但will not save relations。我刚回答了一些related question关于使用分离图的问题。
答案 1 :(得分:0)
使用自我跟踪实体,您必须使用ApplyChanges()方法来同步上下文中的更改(而不是附加)。
applychanges将转到图表以更新链接的对象/集合。
Public Function UpdateEntity(entity As Entity) As Entity
Using dbContext As New EntityContext()
dbContext.EntitySet.ApplyChanges(entity)
dbContext.SaveChanges()
dbContext.Refresh(Objects.RefreshMode.StoreWins, entity)
End Using
Return entity
End Function
刷新是可选的,它只是为了推回数据库的最后一个值。顺便说一下,刷新不会更新链接对象。