2014-01-20 45 views
1

何處以及如何(代碼示例將是巨大的),我可以從例如Customer.cs自動生成的類在我Model.edmx刪除業務邏輯如果把功能和驗證碼實體框架

當我編輯的東西設計師,然後保存更改EF更新類,所以我需要輸入例如默認值(我知道我可以在設計器中設置它們)。

public Customer() 
{ 
    this.Blocked = false; 
    this.Code = "#00000"; 
    this.Contacts = new ObservableListSource<Contact>(); 
} 

另外如何創建/在哪裏把一些基本的驗證(this.Code不能爲空字符串或null)?

謝謝。

回答

2

實體框架生成的類標記爲partial關鍵字,您可以擴展它們添加新文件並創建部分類的其他部分。這還可以防止在更新模型時覆蓋您的更改。

也許什麼更重要的是,EF增加了設定的部分方法,每一個對應的屬性,它允許您添加您自己的驗證邏輯:

OnPropertyChanging - 包括代碼執行發生更改之前,如屬性驗證。值參數是屬性正在更改的值 。實施此方法以 驗證屬性更改是否發生。爲防止發生更改 ,您必須拋出異常。

OnPropertyChanged - 包括髮生改變後的代碼來執行,諸如記錄該變化。

How to: Execute Business Logic During Scalar Property Changes

你的部分類應該看起來像:

public partial class Customer() 
{ 
    partial void OnCodeChanging(string value) 
    { 
     if(string.IsNullOrEmpty(value)) 
      throw new InvalidOperationException ("value cannot be null or empty"); 
    } 

} 

你必須確保它存在於同一個命名空間的另一部分,通過EF創建。

+0

你能幫助我通過'EF6'做同樣的事情,因爲我根本找不到'OnPropertyChanging'嗎? –

1

退房這個項目我工作... https://github.com/NickStrupat/EntityFrameworkCodeFirstTriggers

的的NuGet是... https://www.nuget.org/packages/EntityFrameworkCodeFirstTriggers/

你可以把在實體被持久化時執行(在SaveChanges())邏輯。

customer.Inserting += (sender, args) => ((Customer)customer).Code = "Some default"; 
+0

剛剛打開新的問題,因爲我得到錯誤。你能看到我的新問題有關該錯誤:http://stackoverflow.com/questions/21262760/entity-framework-validation-in-separate-class-error-no-defining-declaration-foun – Carlo

+0

我不得不改變模板。 – Carlo