如何找出 table 中哪个字段已更改?在 C# 中 Entity Framework

How to figure out which field has changed in a table? in C# with Entity Framework

在 table 字段 a, b, c, d, ..., 然后 user x 改变c,d的值,所有字段值override并且c和d的值都改变了, 我要从这个系统得到的历史是:

用户x同时修改了c和d的值,同时显示新旧值,并且其他用户也一样。

如果用户只是编辑但没有对字段进行更改,什么都不会发生

并且为了弄清楚现在哪些字段发生了变化,所有字段都必须进行条件化或者 C# 中是否有一个库来弄清楚哪个字段现在更改了吗?

如果这是一个库,它的一个例子会很有帮助。

如果您按预期使用 EF,那么您可以在提交之前在 changetracker 中找到大部分内容。

_entities.ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified)
            .ToList();

EF 不执行数据库调用,除非实际更新了某些内容

您可以使用 ChangeTracker class 来发现更改的内容。您将需要使用反射来查找每个修改后的实体的属性名称。

foreach (var entry in db.ChangeTracker.Entries().Where(entry => entry.State == EntityState.Added || entry.State == EntityState.Modified))
{
    // Gets all properties from the changed entity by reflection.
    foreach(var entityProperty in entry.Entity.GetType().GetProperties())
    {
        var propertyName = entityProperty.Name;
        var currentValue = entry.Property(propertyName).CurrentValue;
        var originalValue = entry.Property(propertyName).OriginalValue;
    }
}

您可以在此站点找到有关 ChangeTracker 的更多信息:https://www.entityframeworktutorial.net/change-tracking-in-entity-framework.aspx

我已经做过很多次了。使用触发器在数据库端实现起来要容易得多。

create table Customer
(
    CustomerId integer Identy(1,1) primary key,
    CustomerFirstName nvarhar(25),
    CustomerLastName nvarchar(25),
    CustomerAdd1 nvarchar(50),
    CustomerAdd2 nvarchar(50)
)

create table ChangeAudit
(
    AuditId integer Identy(1,1) primary key
    ChangeDt datetime,
    ChangeTable nvarchar(50),
    ChangeField nvarchar(50),
    OldValue nvarchar(max),
    NewValue nvarchar(max),
    ChangedBy nvarchar(50)
)

create trigger CustomerAudit on Customer
after update, insert
as
begin
    if update(CustomerFirstName)
    begin
        insert into ChangeAudit(ChangeDt,ChangeTable,ChangeField,OldValue,NewValue,ChangedBy)
        select getdate(),'Customer', 'CustomerFirstName',d.CustomerFirstName,i.CustomerFirstName,SUSER_SNAME()
        from Customer c,
        inner join inserted i on t.CustomerId = i.CustomerId
        inner join deleted d on t.CustomerId = d.CustomerId
    end

    if update(CustomerLastName)
    begin
        insert into ChangeAudit(ChangeDt,ChangeTable,ChangeField,OldValue,NewValue,ChangedBy)
        select getdate(),'Customer', 'CustomerLastName',d.CustomerLastName,i.CustomerLastName,SUSER_SNAME()
        from Customer c,
        inner join inserted i on t.CustomerId = i.CustomerId
        inner join deleted d on t.CustomerId = d.CustomerId
    end
end