更新实体框架自我跟踪实体

时间:2011-10-18 09:38:38

标签: c# entity-framework

我遇到了一个我认为很容易解决的问题。 这是我的场景(实体框架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,我不确定哪一个是正确的。

由于

2 个答案:

答案 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

刷新是可选的,它只是为了推回数据库的最后一个值。顺便说一下,刷新不会更新链接对象。