2014-10-03 155 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