Entity Framework 更新,如何检查记录是否已更改?

10

我正在使用EF更新数据库表。

这是一个简单的连接模式场景。

我获取要更新的行。

var order = from o in Orders
        where o.ID = 1
        select o;

然后我将记录更新为:

order.FirstName = "First";
order.LastName = "Last";
context.SaveChanges();

它运行得很好。EF会检查字段是否已更改,仅在有新值时更新该字段。我已在我的SQL服务器上启用了CDC以检查EF是否会将其重写到数据库中,如果值未更改,则不会。

现在我想在我的代码中加入此检查以进行其他逻辑,即我希望EF告诉我记录何时被更新,何时没有被更新(因为值未更改)。 请问是否有方法可以实现这一点?

我不想手动检查每个字段,因为我有很多字段要比较。

谢谢


这些答案有帮助吗?https://dev59.com/63E85IYBdhLWcg3wkkU8 - Kane
凯恩,我试过了。但是当我在SaveChanges之前输入这个逻辑var items = ObjectStateManager.GetObjectStateEntries(EntityState.Modified),即使字段没有更改,我也会得到true。 - gunnerz
2个回答

9

如果有人感兴趣,这是我做的。我创建了以下方法来检查在保存更改之前是否有任何字段被修改。

private Dictionary<Type, bool> IsEntityModified()
{
    Dictionary<Type, bool> entity = new Dictionary<Type, bool>();
    var items = _bentities.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
    foreach (ObjectStateEntry entry in items)
    {
        foreach (string propName in entry.GetModifiedProperties())
        {
            string oldsetterValue, newsetterValue = null;
            // Get orginal value 
            oldsetterValue = entry.OriginalValues[propName].ToString();
            // Get new value 
            newsetterValue = entry.CurrentValues[propName].ToString();

            if (oldsetterValue != newsetterValue)
            {
                entity.Add(entry.Entity.GetType(), true);
            }
        }
    }
    return entity;
}

9

我在寻找类似甚至相同的东西时,遇到了这个问题/答案。最终我采用了这种方法,它对我来说似乎完全可行。

var order = from o in context.Orders
        where o.ID = 1
        select o;

order.FirstName = "First";
order.LastName = "Last";

if (context.Entry(order).State != EntityState.Unchanged)
{
    // order has changed ...
}

以下是我做过的一些尝试,希望对其他寻找类似内容的人有所帮助。


出于某种原因,这在我的端上非常慢。 - Mike Flynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接