3

我一直在阅读一些关于使用关系管理器来访问具有相关数据的条目的文章。我仍然不清楚当添加或更新相关数据的实体时,最好的审计方式是什么。

示例类:

public class Rfi
{
     public Guid Id {get;set;}
     public string Number {get;set;}
     public virtual ICollection<Attachment> Attachments {get;set;}
}

public Class Attachment
{
    public Guid Id {get;set;}
    public string Name {get;set;}
    public string Description {get;set;}
    public string FileName {get;set;}
    public string Path {get;set;}        
}

示例映射:

public class RfiMapping: EntityTypeConfiguration<Rfi>
{
     public Rfimapping()
     {
        HasMany(r => r.Attachments).WithMany().Map(m =>
                                                           {
                                                               m.MapLeftKey("RfiId");
                                                               m.MapRightKey("AttachmentId");
                                                               m.ToTable("Rfi_Attachments");
                                                           });
     }
}

我正在使用存储库和工作单元模式。我的 UoW 继承自 DbContext。存储库调用可能如下所示:

public void AddAttachmentToRfi(Attachment attachment, Guid rfiId)
{
     var rfi = _rfiRepository.FindById(rfiId);
     rfi.Attachments.Add(attachment);
     _rfiRepository.UnitOfWork.Commit();
}

是否有可能在重写的 SaveChanges 方法中找出附件实体已添加到 Rfi 实体?当我遍历 ChangeTracker.Entries 时,我没有看到它的状态被设置为已修改。这是有道理的,因为我只是添加到关系而不是直接添加实体。

我知道将我的 DbContext 转换为 IObjectContextAdapter,但我不确定我需要对 RelationshipManager 做什么才能对任何关系进行更改。我也很想知道我以后是否要更新附件的描述属性,如果我仍然可以看到对任何相关数据进行了哪些更改。

我的目标是,Rfi 的用户界面允许用户附加文件(Rfi 显然不是唯一可以有附件的实体)。我需要展示 Rfi 发生的所有事情的历史。这意味着如果添加了附件,我需要对其进行审核。如果附件的数据更新了,我需要审核这些更改并显示它们是通过 Rfi 接口更新的。如果该附件与另一个实体共享,这可能会变得复杂,但我稍后会穿过那条路。

4

1 回答 1

1

正如您所说,您不会更改任何实体,只会更改它们之间的关系。

然后,EF 会将其转换为对 Rfi_Attachments 表的插入或删除。

对此进行审核的一种方法是添加一个数据库触发器,该触发器在每次添加或删除条目时将条目写入日志表。

于 2013-03-27T19:42:14.947 回答