gpt4 book ai didi

c# - 在 Entity Framework 中删除之前更新

转载 作者:行者123 更新时间:2023-11-30 16:49:19 25 4
gpt4 key购买 nike

出于审计目的,我需要在删除行之前更新某些表上的“UpdatedBy”列,这将触发一些第三方审计。

我当前的解决方案是在我的 Context 类上创建自定义 SaveChanges 方法,但我对已删除实体所做的任何更改都将被忽略,生成的 SQL 只是一个 DELETE 命令。

是否可以在 SaveChanges 方法中为实体触发 UPDATE 和 DELETE?

CS 代码

public partial class MyContext : DbContext
{
public int SaveChanges(int userId)
{
foreach (var entry in ChangeTracker.Entries<Auditable>())
{
if (entry.State == EntityState.Deleted)
{
entry.Entity.UpdatedBy = userId;
}
}

return base.SaveChanges();
}
}

生成的示例 SQL

DELETE FROM EntityTable
WHERE Id = @00

所需的 SQL

UPDATE EntityTable
SET UpdateBy = @00
WHERE Id = @01

DELETE FROM EntityTable
WHERE Id = @01

更新

澄清一下,我使用的是在单独数据库中创建新行的第三方审计框架。在 DELETE 之前执行 UPDATE 的目的是允许单独的数据库存储执行删除的用户 ID。因此,虽然该行已从原始数据库中删除,但需要创建审计行,这是由 UPDATE 触发的。

最佳答案

不能强制 Entity Framework 执行更新和删除,但我可以生成 SQL 来手动调用更新。并在事务中运行更改。

    int SaveChangesWithDelete(int userId)
{
using (var tx= Database.BeginTransaction()) //Begin a new transaction
{
var entitiyGroups = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Deleted && e.Entity is Auditable)
.Select(e => e.Entity)
.GroupBy(d => d.GetType();

foreach (var entityGroup in entitiyGroups) //Loop through deleted entities and run a manual UPDATE
{
string query = string.Format(@"
UPDATE {0} SET UpdatedBy = {1}
WHERE Id IN ({2})
", entityGroup.Key.Name, userId, string.Join(",", entityGroup.Select(e => PrimaryKeyValue(e))));

Database.ExecuteSqlCommand(query); //Execute the query - this triggers the audit framework
}

int result = SaveChanges(); //save the context changes as normal
tx.Commit(); //commit the transaction
return result; //return the result
}
}

关于c# - 在 Entity Framework 中删除之前更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36889216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com