实体框架InverseProperty注释用法

时间:2014-10-03 13:19:08

标签: c# asp.net-mvc entity-framework-6

如果我有以下型号,我是否正确使用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个,对于从Hobbies继承的每种类型看起来都是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.

1 个答案:

答案 0 :(得分:1)

首先, 这看起来很奇怪:您正在使用不同的名称创建多个映射到同一个对象?

 [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();
    }
}

如果在抽象类中设置属性Person,则映射必须是抽象类。

否则,您必须在抽象类中声明PersonId,然后使用属性[ForeignKey(&#34; PersonId&#34;)]在每个具体类中设置Person属性。但这个解决方案很奇怪。

其次,如果要为Person指定ForeignKey,则应使用:

[ForeignKey("PersonID")]
public virtual Person Person {get;set;}
第三:你确定你不需要M-N关系吗?你是否真的希望每个人都创造新的爱好(你最终会有多次&#34;驾驶&#34;(或者其他什么)作为一种爱好)。