2011-06-20 65 views
1

在新項目上,我想使用Entity Framework的「代碼優先」功能來設置我的數據存儲。使用對象的基類爲EF4.1創建問題POCO

在我的項目中,我可能有多種類型的人(票務持有人,旅行者,銷售代理人等),但我只想驗證持票人。所以我創建了一個類型爲「Person」的基類,它沒有驗證屬性和一個類型爲「TicketHolder」的繼承類,該類包含First Name的驗證等)。

我的問題是EF時拋出了異常:模型生成過程中檢測到

一個或多個驗證錯誤: System.Data.Edm.EdmProperty:名稱:在類型每個屬性名稱必須是唯一的。屬性名稱'標題'已經定義。

看起來EF並未意識到「TicketHolder」的屬性會覆蓋「Person」的屬性。

我該如何解決這個問題?

基類:

public abstract class Person 
{ 
    public int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

爲TicketHolder派生類:

public class TicketHolder : Person 
{ 
    [Required(ErrorMessage = "Title Required")] 
    public override string Title { get; set; } 

    [Required(ErrorMessage = "First Name Required")] 
    public override string FirstName { get; set; } 

    [Required(ErrorMessage = "Last Name Required")] 
    public override string LastName { get; set; } 

} 

回答

0

嘗試abstract而不是virtual

public abstract class Person { 
     public int Id { get; set; } 
     public abstract string Title { get; set; } 
     public abstract string FirstName { get; set; } 
     public abstract string LastName { get; set; } 
     public DateTime DateOfBirth { get; set; } 
    } 

您也可能會考慮使用MetadataTypeAttribute將元數據與實體分開。

+0

嗨Jakub ...我用虛擬的,因爲如果我創建另一個派生類,我不會然後需要實現標題,名字和姓氏屬性。 – FloatLeft

+0

@FloatLeft - 比你應該創建一個MetadataTypeAttribute'元數據好友類' –