我試圖在我的MVC 4中使用EF應用程序實現審計,如本帖http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/。如何將要插入數據庫的對象與尚未使用實體框架插入的對象相關聯?
我有一個繼承自DbContext並覆蓋SaveChanges方法的類。在這個新的SaveChanges方法中,我將一條記錄插入審計表。
可以審計的實體:和
public class FruitAudit
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long FruitAuditId{ get; set; }
public long FruitId{ get; set; }
// Auditing properties like modifying user and timestamps.
}
我被覆蓋的SaveChanges方法:
public int SaveChanges()
{
var entriesToAudit = this.ChangeTracker.Entries().Where(p =>
(p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted || p.State == System.Data.EntityState.Modified);
foreach (var entity in entriesToAudit)
{
using (var context = new StoreContext())
{
Fruit fruit = entity.Entity as Fruit;
FruitAudit audit = new FruitAudit()
{
FruitId = Fruit.FruitId;
// Other auditing properties set here
}
context.FruitAudits.Add(audit);
context.SaveChanges();
}
}
return base.SaveChanges();
}
發生錯誤時
public class Fruit
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long FruitId{ get; set; }
public string FruitName{ get; set; }
}
而且FruitAudit表的模型因爲在嘗試保存FruitAudit記錄時FruitId尚未設置,所以插入了一個Fruit。 FruitId是從數據庫自動生成的,但直到插入審計記錄後纔會保存實際的Fruit對象。我怎樣才能將FruitAudit與插入的Fruit相關聯?
如果我的所有對象更改都有關聯的審覈,但是其中一些沒有關聯審覈,則可以使用此功能。在這種情況下,我需要將它們添加到base.SaveChanges()中。但是,如果我在審覈期間保存了更改,則該通話將失敗。有任何想法嗎? – burntmarshmallows
還有一個'BeforeSaveChanges',你可以覆蓋它。很難理解你的情況,但是如果你有這樣的多重條件,可能會有一些用處。 –