如何找出 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
在 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