实体框架6-基类的继承和导航属性

佐拉

我对导航属性和继承有疑问。

这是我的问题:我有一个或多个基Person类,User并且Worker它们从继承Person在数据库级别,我正在使用单表继承或按层次结构表(TPH)继承。因此,有一个带有鉴别符列的表。

双方UserWorker需要有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列,该列不存在。

我尝试了几件事,没有任何结果:

  • 将列从重命名CompanyIDCompany_ID->它会Column_ID1在SQL中生成一个并抛出相同的异常
  • ->中删除UsersandWorkers关系,Company它抛出一个异常,表示它不知道如何映射UserCompany实体:

无法确定类型“ Models.User”和“ Models.Company”之间的关联的主要终点。必须使用关系流利的API或数据注释显式配置此关联的主要端。

  • 如果我从中删除所有3个导航属性,Company则会引发与上述相同的映射异常

我目前没有“干净”的想法。唯一可行的方法是进行一些卑鄙的修改,定义子类上的所有关系,并在需要用户和工作人员的情况下分别进行查询和合并到基类中。

你有什么建议吗?

Codeworx

删除“用户和工作人员”集合属性。

public virtual ICollection<User> Users { get; set; }

public virtual ICollection<Worker> Workers { get; set; }

由于您的公司导航属性是在Person上定义的,因此关联的后向导航属性必须是Person的ICollection。

人员集合将包含所有关联的工作人员和用户。用户和辅助程序这两个额外的属性被解释为全新的关系,因为您没有相应的属性,并且用户或辅助程序EF上的外键实际上会生成它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架6导航属性别名?

来自分类Dev

SQLite和实体框架6

来自分类Dev

实体框架6和集合

来自分类Dev

实体框架6和集合

来自分类Dev

实体框架6和oracle

来自分类Dev

实体框架6中的基类?

来自分类Dev

具有导航属性的实体框架继承

来自分类Dev

实体框架6和SQL Server序列

来自分类Dev

使用实体框架6和SQLite的问题

来自分类Dev

SQL存储的proc和实体框架6

来自分类Dev

实体框架6和输出参数

来自分类Dev

实体框架6-代码优先-FK在继承的类中生成,但关系在基类中定义

来自分类Dev

实体框架6-代码优先-FK在继承的类中生成,但关系在基类中定义

来自分类Dev

实体框架6上下文未检索导航属性

来自分类Dev

实体框架6键和列属性的位置

来自分类Dev

实体框架6键和列属性的位置

来自分类Dev

实体框架基类

来自分类Dev

实体框架断开图和导航属性

来自分类Dev

带有MySQL的实体框架6-类库

来自分类Dev

实体框架 6 扩展迁移类以映射新值

来自分类Dev

实体框架6-将主键作为类型的属性

来自分类Dev

实体框架6 MySQL-属性未正确插入

来自分类Dev

IronPython实体框架6在以下位置找不到属性

来自分类Dev

实体框架6,存储库模式和工作单元

来自分类Dev

ODAC 12c和实体框架6

来自分类Dev

使用实体框架6的初始负载和性能问题

来自分类Dev

ASP.net vNext和实体框架6

来自分类Dev

如何使用LINQ和实体框架6进行表联接?

来自分类Dev

使用SqlAzureExecutionStrategy和Amazon EC2的实体框架6