gpt4 book ai didi

entity-framework - 更新多对多 Entity Framework 模型中的审计字段

转载 作者:行者123 更新时间:2023-12-02 05:00:19 25 4
gpt4 key购买 nike

我有一个具有如下多对多关系的遗留数据库:

    public class Post  
{
public ICollection<Tag> Tags { get; set; }

...
}

public class Tag
{
public ICollection<Post> Posts { get; set; }

...
}

在“PostTagLink”表中跟踪多对多关系。

通常很容易使用 Code First 或多或少地隐含地表达多对多关系,即在添加或删除关系时更新“PostTagLink”表,但实际上没有显式的“PostTagLink”实体定义。

在保存更改时,DbContext 可以轻松更新标签和帖子上的审计字段:

    public abstract class MyAuditableEntityContext : DbContext
{
public override int SaveChanges()
{
string currentUser = Thread.CurrentPrincipal.Identity.Name;

foreach (DbEntityEntry<IAuditableEntity> changeEntry in base.ChangeTracker.Entries<IAuditableEntity>())
{
if (changeEntry.State == EntityState.Added)
{
changeEntry.Entity.CreatedBy = currentUser;
changeEntry.Entity.RevisedBy = currentUser;
}
else if (changeEntry.State == EntityState.Modified)
{
changeEntry.Entity.RevisedBy = currentUser;
}
}

return base.SaveChanges();
}
}

但是如果“PostTagLink”表也包含审计字段怎么办?

我能看到的唯一解决方案是在模型中包含一个 PostTagLink 实体(与 Tag 和 Post 具有多对一关系),这样我就可以访问 DbContext SaveChanges 方法中的审计字段。

但是添加这些额外的实体会使使用模型变得笨拙。客户端和查询必须直接处理“链接”实体,而不是 Entity Framework 自动处理关系更改。

问题:是否有一些 Entity-Framework-ninja 技术可以拦截对多对多关系的更改并根据需要更新链接表审计字段,而不必显式包含“链接”模型中的实体?

(同样 - 这是一个遗留数据库,我几乎无法更改它,所以我想避免向数据库添加存储过程或任何其他逻辑。)

感谢您的宝贵时间!

最佳答案

因此,如果我理解正确的话,当您将一个项目添加到其中一个集合并保存该实体时,您需要在多对多表中设置一个 CreatedBy 字段。您可以使用 DbContext.Database.SqlCommand 执行原始 sql 来更新链接表审计字段。 How to execute raw sql .

那么如何拦截变化呢?

这些答案可能会有所帮助:EF4 Audit changes of many to many relationshipsEntity Framework: Tracking changes to FK associations

编辑:

此处供引用的是 original example我发布的内容可能让您相信您必须将 sql 放入您的模型中

关于entity-framework - 更新多对多 Entity Framework 模型中的审计字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16925471/

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