8

我正在使用 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 告诉我记录何时更新,何时没有更新(因为值没有改变)。谁能告诉我有没有办法?

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

谢谢

4

2 回答 2

7

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

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;
}
于 2012-07-17T09:56:47.440 回答
7

当我在寻找类似的东西(如果不是相同的东西)时,我遇到了这个问题/答案。我最终使用了这种方法,这对我来说似乎没问题。

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 ...
}

因此,发布对我有用的东西,以防它可能对来这里寻找类似东西的其他人有所帮助。

于 2020-01-27T21:49:59.557 回答