我一直在阅读一些关于使用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界面更新的。如果该附件与另一个实体共享,这可能会变得复杂,但我稍后会越过这条路。
答案 0 :(得分:1)
正如你所说,你不是只改变任何实体之间的关系。
然后,EF会将其转换为插入或删除Rfi_Attachments表。
审核此问题的一种方法是添加一个数据库触发器,每次添加或删除条目时都会将条目写入日志表。