Entity Framework InverseProperty annotation usage(实体框架 InverseProperty 注释使用)
问题描述
如果我有以下模型,我是否正确使用了 InverseProperty?
if I have the following models, am I using the InverseProperty correctly?
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 列(其中 4 个,每种类型看起来像 1 个继承自爱好),我不希望这样,
this works when I don't use the InverseProperty but the problem is that the database creates duplicate PersonID columns (like 4 of them, looks like 1 for each type that inherits from Hobbies), and I don't want that,
但是,当我使用 InversePorperty 时出现异常:
However, when I use InversePorperty I get an exception:
Schema specified is not valid. Errors: The relationship 'x.x.Person_Reading' was not loaded because the type 'x.x.Hobbies' is not available.
推荐答案
首先,这看起来很奇怪:您正在创建多个映射到具有不同名称的同一个对象 q?
First, This looks strange : you are creating multiple mapping to the same object qwith different names ?
[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属性,那么映射必须是抽象类.
If you set the property Person in the abstract class, then the mapping must be to the abstract class.
否则,您必须在抽象类中声明 PersonId,然后使用属性 [ForeignKey("PersonId")] 在每个具体类中设置 Person 属性.但是这个解决方案很奇怪.
Otherwise, you have to declare the PersonId in the abstract class and then set the Person property in every concrete class using the attribute [ForeignKey("PersonId")]. But this solution is pretty strange.
其次,如果你想为 Person 指定 ForeignKey,你应该使用:
Secondly, if you want to specify the ForeignKey for the Person, you should use :
[ForeignKey("PersonID")]
public virtual Person Person {get;set;}
第三:你确定你不需要 M-N 关系吗?你真的希望每个人都创造新的爱好吗(你最终会有多次驾驶"(或其他)作为爱好).
Third : Are you sure you don't need M-N relation? Do you really want every people to create new Hobbies (you would finally have multiple times "Driving" (or whatever) as a hobby).
这篇关于实体框架 InverseProperty 注释使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:实体框架 InverseProperty 注释使用
基础教程推荐
- 在 VB6 或经典 ASP 中使用 .NET 2022-01-01
- 更新 Visual Studio 中的 DataSet 结构以匹配新的 SQL 数据库结构 2022-01-01
- SonarQube C# 分析失败“不是指针的有效行偏移" 2022-01-01
- 如果条件可以为空 2022-01-01
- C# 9 新特性——record的相关总结 2023-04-03
- Mono https webrequest 失败并显示“身份验证或解密失败" 2022-01-01
- 重新排序 WPF TabControl 中的选项卡 2022-01-01
- 获取C#保存对话框的文件路径 2022-01-01
- 从 C# 控制相机设备 2022-01-01
- 将数据集转换为列表 2022-01-01
