2

我正在使用EF 4.1數據庫。我想知道我可能使用Entity Partial Classes是什麼類型的東西。我可能想要添加到部分類中的可能功能的一些示例是什麼?我只是想了解是否應該讓我的實體更有能力,或者我應該在其他地方添加功能?對於我想要添加到實體中的事物,是否有很好的案例?我應該使用實體框架實體部分類應該做什麼?

例如,我有一個實體,具有各種兒童屬性的開始和結束日期。這些日期不能重疊。這是我應該強制執行的父實體嗎?


好吧,所以建議似乎是驗證和業務邏輯。另外計算事情,以便DB沒有計算列。


我應該將業務邏輯綁定到實體框架實體嗎?如果我想離開EF,該怎麼辦?

由於

格雷姆

回答

1

是Validatable對象和MetadataType屬性在部分類由框架如MVC使用,例如。

下面是一個使用MetadataType屬性的例子:

[MetadataType(typeof(UserMetadata))] 
public partial class User 
{ 
    private class UserMetadata 
    { 
     [DisplayName("User Id")] 
     public long UserId 
     { 
      get; 
      set; 
     } 

     [DisplayName("User Name")] 
     public string UserName 
     { 
      get; 
      set; 
     } 
    } 
} 

當您使用MVC框架,具有這些屬性將被讀取自動生成標籤字段的宗旨,爲相應的顯示器的任何模型/編輯。

使用IValidatableObject

public partial class Apple : IValidatableObject // Assume the Apple class has an IList<Color> property called AvailableColors 
{ 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     foreach (var color in this.AvailableColors) 
     { 
      if (color.Name == "Blue") // No blue apples, ever! 
      { 
       yield return new ValidationResult("You cannot have blue apples."); 
      } 
     } 
    } 
} 

MVC會拿起這個IValidatableObject並確保通過說到它的方式任何蘋果的驗證步驟將永遠不會在藍色的例子。使用IValidatableObject

編輯

隨着日期範圍關注的一個例子:

public partial class ObjectWithAStartAndEndDate : IValidatableObject 
{ 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (this.StartDate >= this.EndDate) 
     { 
      yield return new ValidationResult("Start and End dates cannot overlap."); 
     } 
    } 
} 
+0

那麼主要確保實體是一件有效的事情? – GraemeMiller

+1

任何類型的業務邏輯,真的。如果您有另一個不同類型的屬性被設置並且不需要其他屬性時需要一個屬性,則可以通過在部分類中實現「ghost方法」來完成此操作。 –

+0

我想我正在使用AutoMapper來製作ViewModels並且它們有顯示名稱。不過,我想我需要在ViewModel和Entity上強制執行所需的等。 – GraemeMiller

1

我已經用它來增加我生成的類與計算值,當我寧願沒有DB已經計算了列。

相關問題