2014-10-03 88 views
0

如果我有以下模型,我是否正確使用InverseProperty?實體框架InverseProperty註釋用法

class Person { 
public int PersonID {get;set;} 

[InverseProperty("Person")] 
public List<Hobbies> Sports {get;set;} 

[InverseProperty("Person")] 
public List<Hobbies> Art {get;set;} 

[InverseProperty("Person")] 
public List<Hobbies> Reading {get;set;} 
} 

abstract class Hobbies { 
public int HobbiesID {get;set;} 
public string HobbyName {get;set;} 
public int HobbyRating {get;set;} 

public int PersonID {get;set;} 
public Person Person {get;set;} 
} 

class Sports : Hobbies {} 
class Art : Hobbies {} 
class Reading : Hobbies {} 

這作品時,我不使用InverseProperty但問題是,數據庫中創建複製PersonID columns(像他們一樣的4,貌似1,從愛好繼承每種類型的),我不希望這樣,

然而,當我使用InversePorperty我得到一個異常:

Schema specified is not valid. Errors: The relationship 'x.x.Person_Reading' was not loaded because the type 'x.x.Hobbies' is not available. 
+0

您尚未將Hobbies上的Person屬性的外鍵指定爲personID。也許這是造成這個問題的原因。添加'[ForeignKey(「PersonID」)]'屬性。 – 2014-10-03 13:25:11

+0

@ odyss-jii會試着讓你知道,謝謝! – 2014-10-03 13:25:49

+0

@ odyss-jii我得到了同樣的例外 – 2014-10-03 13:27:37

回答

1

首先, 這看起來很奇怪:要創建多個映射到同一個對象qwith不同的名字?

[InverseProperty("Person")] 
public List<Hobbies> Sports {get;set;} 

[InverseProperty("Person")] 
public List<Hobbies> Art {get;set;} 

[InverseProperty("Person")] 
public List<Hobbies> Reading {get;set;} 

它應該是這樣的:

[InverseProperty("Person")] 
public virtual List<Hobbies> Hobbies {get;set;} 

[NotMapped] 
public List<Sport> Sports 
{ 
    get 
    { 
     return this.Hobbies.OfType<Sport>().ToList(); 
    } 
} 


[NotMapped] 
public List<Art> Art 
{ 
    get 
    { 
     return this.Hobbies.OfType<Art>().ToList(); 
    } 
} 


[NotMapped] 
public List<Reading> Readings 
{ 
    get 
    { 
     return this.Hobbies.OfType<Reading>().ToList(); 
    } 
} 

如果設置在抽象類的財產的人,則映射必須是抽象類。

否則,您必須在抽象類中聲明PersonId,然後使用屬性[ForeignKey(「PersonId」)]在每個具體類中設置Person屬性。但是這個解決方案很奇怪。

其次,如果要指定人ForeignKey的,你應該使用:

[ForeignKey("PersonID")] 
public virtual Person Person {get;set;} 

三:你確定你不需要M-N的關係?你真的希望每個人都創造新的愛好(你最終會多次「駕駛」(或其他)作爲愛好)。

+0

是啊我想能夠擁有一份興趣愛好,因爲例如:體育愛好{足球:2007年,網球:2008年,足球:2010年}列表,所以人們可以看到什麼他們打哪一年的體育比賽,和其他比賽一樣。但我會嘗試你的建議,希望它能工作,我還沒有嘗試過你的建議,因爲我是實體框架的新手。謝謝!! – 2014-10-03 14:20:44

+0

另外,什麼是MN關係 – 2014-10-03 14:22:45

+0

這就是爲什麼我添加了3個未映射的屬性,所以你可以得到每個類型的屬性(自動加載,因爲它是基於Hobbis屬性標記爲「虛擬」 - 意味着懶加載EF) – Whoami 2014-10-03 14:23:38