2013-09-22 20 views
1

我試圖在我的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相關聯?

回答

0

,讓你有類似的東西我會建議使用虛擬導航屬性FruitAudit

public class FruitAudit 
{ 
    public int FruitAuditId { get; set; } 

    public int FruitId { get; set; } 
    public virtual Fruit Fruit { get; set; } 
} 

而且你Fruit樣子:

public class Fruit 
{ 
    public int FruitId { get; set; } 

    public string FruitName { get; set; } 
} 

然後,當你去SaveChanges()你只是說:

Fruit fruit = entity.Entity as Fruit; 
FruitAudit audit = new FruitAudit() 
{ 
    Fruit = fruit; 
    // Other auditing properties set here 
} 

... 

context.Fruits.Add(fruit); 
context.FruitAudits.Add(audit); 
+0

如果我的所有對象更改都有關聯的審覈,但是其中一些沒有關聯審覈,則可以使用此功能。在這種情況下,我需要將它們添加到base.SaveChanges()中。但是,如果我在審覈期間保存了更改,則該通話將失敗。有任何想法嗎? – burntmarshmallows

+0

還有一個'BeforeSaveChanges',你可以覆蓋它。很難理解你的情況,但是如果你有這樣的多重條件,可能會有一些用處。 –

0

我結束了製作所有實體更改的副本,然後調用base.SaveChanges()。這將插入所有的水果。然後我瀏覽實體更改的副本並插入每個實體的審計記錄。

相關問題