审核实体框架中的多对多关系?

时间:2012-05-08 00:46:19

标签: entity-framework entity-framework-4.1

我一直在阅读一些关于使用RelationshipManager访问具有相关数据的条目的技巧。我还不清楚在添加或更新相关数据的实体时,审核的最佳方法是什么。

示例类:

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界面更新的。如果该附件与另一个实体共享,这可能会变得复杂,但我稍后会越过这条路。

1 个答案:

答案 0 :(得分:1)

正如你所说,你不是只改变任何实体之间的关系。

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

审核此问题的一种方法是添加一个数据库触发器,每次添加或删除条目时都会将条目写入日志表。