我有類似下面的許多一對多的關係,舊的數據庫:更新審計領域的一個多到許多實體框架模型
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實體的唯一解決方案(帶有多對一的關係返回標籤和帖子),因此我可以訪問DbContext SaveChanges方法中的審覈字段。
但是添加這些額外的實體使得使用該模型變得尷尬。客戶和查詢必須直接使用「鏈接」實體,而不是實體框架自動處理關係更改。
問題:是否有一些Entity-Framework-ninja技術,我可以攔截多對多關係的更改並根據需要更新鏈接表審計字段,而不必明確包含「鏈接」實體在模型中?
(再次 - 這是一箇舊的數據庫,有一點我可以做些什麼來改變它,所以我想避免添加存儲過程或任何其他邏輯數據庫。)
感謝您的時間!
謝謝科林。我認爲在模型中注入SQL將會比我的情況更糟糕。儘管我懷疑該方法或使用SQL直接調用存儲過程是EF5中唯一真正的選項。也許當模型中的EF6和sprocs支持可用時,在檢測到關係變化後,我可以從模型中調用sproc。 –
對不起。我在模型中給了你一個使用ObjectContext的不好的例子的鏈接。你不需要把代碼放在模型中,你可以使用DBContext來完成。我會修改我的問題中的鏈接 – Colin