1

我想通過Data Annotation創建Discriminator列。用流利的通過數據註釋創建Entity Framework TPH鑑別器列

modelBuilder.Entity<Book>() 
      .Map<StoryBook>(m => m.Requires("typetitle").HasValue("story")); 

[Table("Book")] 
public partial class Book 
{ 
    public long BookID { get; set; } 

    [StringLength(100)] 
    public string name { get; set; } 

    public int? page { get; set; } 

} 

映射無論如何,我需要有鑑別列值的選擇結果

回答

0

我想通過數據註解來創建鑑別列。

你不能註釋一個不存在的屬性。

對於TPH繼承,鑑別器屬性不是類模型的一部分。這是因爲將其值設置爲另一個類型的值會產生歧義:類型A,標記爲類型B.因此,EF只會阻止開發人員這樣做。

所以:映射TPH繼承只能通過流暢的映射來完成。

無論如何,我需要有鑑別列值的選擇結果

如果您需要在代碼中鑑別值,這通常是你或者不適用,繼承的方式應該露出蛛絲馬跡,或者你根本不應該使用繼承。反對使用繼承的一個指標是在運行時應該改變對象的「類型」(即,鑑別器的值被改變)的情況。

+0

如何在結果中看到鑑別器屬性值。即'context.Books.Find(2)' – Hamid

+0

就像我說的,你不能。這不是一個暴露的財產。當繼承得到很好的使用時,你不需要知道你正在處理哪個子類型。這是多態性的一點。如果您確實需要在運行時知道類型,我的建議不是使用繼承,而是使用類型屬性並根據其值進行操作。但是這個討論超出了你的問題的範圍。 –

+0

順便說一句,你可以通過'context.Books.OfType ()'得到一個子類型的集合。 –