【发布时间】:2014-08-20 17:42:18
【问题描述】:
导航属性和继承有问题。
这是我的问题:
我有一个基类Person 和类User 和Worker,它们继承自Person。在数据库级别上,我使用单表继承或每层次表 (TPH) 继承。所以有一个带有鉴别器列的表。
User 和Worker 都需要有Company 关系,所以我想在Person 类上定义它。
我这样定义我的模型:
[Table("mydb.person")]
public abstract partial class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ID { get; set; }
public long? CompanyID { get; set; }
[ForeignKey("CompanyID")]
public virtual Company Company { get; set; }
...
}
public partial class User : Person
{
...
}
public partial class Worker : Person
{
....
}
[Table("mydb.company")]
public partial class Company
{
public Company()
{
this.People = new HashSet<Person>();
this.Users = new HashSet<User>();
this.Workers = new HashSet<Worker>();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ID { get; set; }
public virtual ICollection<Person> People { get; set; }
public virtual ICollection<User> Users { get; set; }
public virtual ICollection<Worker> Workers { get; set; }
...
}
现在,当我尝试进行查询以获取用户和相关公司时,例如:
dbSet.Where(u => u.Username == username).Include(x => x.Company).FirstOrDefault();
查询失败,出现以下异常:
“字段列表”中的未知列“Extent1.Company_ID”
如果我检查结果 SQL,它看起来像这样:
SELECT
1 AS `C1`,
@gp2 AS `C2`,
`Extent1`.`ID`,
`Extent1`.`CompanyID`,
`Extent1`.`Username`,
...
`Extent1`.`Company_ID`
FROM `person` AS `Extent1`
WHERE `Extent1`.`Discriminator` = @gp1
它包括额外的Company_ID 列,该列不存在。
我尝试了一些东西,但没有成功:
- 将列从
CompanyID重命名为Company_ID-> 它会在 SQL 中生成Column_ID1并引发相同的异常 - 从
Company中删除Users和Workers关系-> 它抛出一个异常,说它不知道如何映射User和Company实体:
无法确定之间关联的主体端 类型“Models.User”和“Models.Company”。这个的主要目的 关联必须使用任一显式配置 关系流式 API 或数据注释。
- 如果我从
Company中删除所有 3 个导航属性,则会引发与上述相同的映射异常
我目前没有“干净”的想法。唯一可行的方法是做一些肮脏的修改,定义子类上的所有关系,并在需要用户和工作人员时在基类中进行单独的查询和合并。
你有什么建议吗?
【问题讨论】:
标签: c# entity-framework inheritance orm entity-framework-6