2013-12-19 20 views
2

我有一個代碼,第一種模式:EF 6碼的第一個對象生命週期/信號/活動

public class Organization 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public DateTime Created { get; set; } 

    [Required] 
    public DateTime Updated { get; set; } 
} 

我想創建/更新日期自動分配每當創建模型/更新。我已經在上下文中看到了一些這樣做的例子,但似乎錯誤。什麼是正確的方法來做到這一點?

例如,在Django中,我可以使用django.models.signals.pre_savedjango.models.signals.post_save來修改對象的前/後保存。

或者我正在處理這個問題,我應該一起使用另一種方法嗎?

+0

的背景下,這樣做似乎沒有太我錯了。上下文知道物體被保存的時刻,DbContext和POCO之間沒有任何接線。 (請注意_between_之間的詞)。個人而言,我認爲這是錯的,因爲我認爲這應該由數據庫觸發器來完成。 –

回答

3

是的,你可以插入自定義的OnUpdate和OnCreate中的邏輯。您需要覆蓋SaveChanges()並添加抽象類,我們將其稱爲Entity。然後在模型類中繼承Entity,這意味着現在可以在模型中調用OnUpdate/OnCreate函數,並且這些函數將自動注入。

下面是你的例子的樣子。

YourDataContext.cs

namespace YourProject.Models 
{ 
    public class YourDataContext : DbContext 
    { 
     public DbSet<Organization> Organizations { get; set; } 

     public override int SaveChanges() 
     { 
      var changedEntities = ChangeTracker.Entries(); 

      foreach (var changedEntity in changedEntities) 
      { 
       if (!(changedEntity.Entity is Entity)) continue; 
       var entity = (Entity)changedEntity.Entity; 

       switch (changedEntity.State) 
       { 
        case EntityState.Added: 
         entity.OnBeforeInsert(); 
         break; 

        case EntityState.Modified: 
         entity.OnBeforeUpdate(); 
         break; 

       } 
      } 

      return base.SaveChanges(); 
     } 
    } 

    public abstract class Entity 
    { 
     public virtual void OnBeforeInsert() { } 
     public virtual void OnBeforeUpdate() { } 
    } 
} 

Organization.cs

public class Organization : Entity 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public DateTime Created { get; set; } 

    [Required] 
    public DateTime Updated { get; set; } 

    public override void OnBeforeInsert() 
    { 
     this.Created = DateTime.Now; 
     this.Updated = DateTime.Now; 
    } 

    public override void OnBeforeUpdate() 
    { 
     this.Updated = DateTime.Now; 
    } 
} 
+1

這看起來不錯,但我必須想象EntityFramework已經有這樣的東西了。 – samuraisam

+0

我不這麼認爲。這是非常靈活的,可以讓你的模型在update/beforeinsert函數之前進行標準化。 – sed

+0

這是爲我工作。謝謝史蒂夫! – samuraisam

0

這個怎麼樣

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime Created{ get; private set; } 


[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime Updated{ get; private set; } 
+1

這段代碼的行爲是什麼? – samuraisam