2011-05-15 179 views
0

當使用EF/code-first將實體保存到數據庫時,是否有一種很好的方法來執行代碼?如何使用實體框架代碼優先將實體持久保存到數據庫時執行代碼?

我在我的許多實體上有Url屬性。如果URL沒有得到明確,我想計算一個作爲對象持久化,例如:

public void OnModelSaving() 
{ 
    // If a URL has not been specified, generate one from the name. 
    if (this.Url == null) 
    { 
     this.Url = Helper.GenerateSafeUrl(this.Title); 
    } 
} 

理想情況下,我想這一切的代碼存儲模型裏面,但因爲我沒有EF擁有的基礎課程/部分課程,我懷疑如果可能的話,我必須在其他地方註冊/連接它。問題是 - 是否有可能,如果是這樣,我該如何連接它?

回答

1

的唯一方法是重寫你的背景下SaveChanges方法,通過改變實體迭代並檢查Url

public override int SaveChanges() 
{ 
    var entities = ChangeTracker.Entries() 
           .Where(e => e.State == EntityState.Added || 
              e.State == EntityState.Modified) 
           .Select(e => e.Entity()) 
           .OfType<YourEntityType(); 

    foreach (var entity in entities) 
    { 
     entity.Url = ...; 
    } 

    return base.SaveChanges(); 
} 

如果你有很多的實體類型提供Url你可以嘗試定義與Url通過實現界面所有實體類型和OfType都使用該接口。

+0

我有一種感覺,我需要這樣做,所以我已經想過接口。我認爲,而不是有一個Url的東西的接口,我會添加一個通用的,只有一個OnModelSaving方法,因此它可以用於任何實體用於任何目的。恥辱它不是內置的。謝謝! – 2011-05-15 13:19:01

相關問題