【问题标题】:Entity Framework InverseProperty annotation usage实体框架 InverseProperty 注释使用
【发布时间】:2014-10-03 22:13:45
【问题描述】:

如果我有以下模型,我是否正确使用了 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.

【问题讨论】:

  • 您没有将 Hobbies 上的 Person 属性的外键指定为 PersonID。也许这是造成问题的原因。添加[ForeignKey("PersonID")]属性。
  • @odyss-jii 会尽力让您知道,谢谢!
  • @odyss-jii 我遇到了同样的异常

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


【解决方案1】:

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

 [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("PersonId")] 在每个具体类中设置 Person 属性。但是这个解决方案很奇怪。

其次,如果你想为 Person 指定 ForeignKey,你应该使用:

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

第三:你确定你不需要 M-N 关系吗?你真的希望每个人都创造新的爱好吗(你最终会有多次“驾驶”(或其他)作为爱好)。

【讨论】:

  • 是的,我希望能够保存一份爱好列表,例如:运动爱好列表 {soccer:2007,tennis:2008,soccer:2010} 这样人们就可以看到他们参加了哪些运动哪一年,其他的也一样。但我会尝试你的建议,希望它会奏效,我没有尝试过你的建议,因为我是实体框架的新手。谢谢!!
  • 还有,什么是M-N关系
  • 这就是为什么我添加了 3 个未映射的属性,这样您就可以使用该属性获得每种类型的爱好(自动加载,因为它基于标记为“虚拟”的 Hobbis 属性 - 意味着延迟加载英孚)
  • 没有映射有什么作用?
  • @AbdulAhmad,M-N 关系:人 PersonH​​obby 爱好。这意味着您可以定义一个爱好,每个人都可以使用相同的爱好,而无需创建新的爱好。他们只会在爱好和人之间建立联系。 en.wikipedia.org/wiki/Many-to-many_(data_model)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多