在Entity Framework Code First中设置1:0/1关联的主要关系

时间:2018-01-18 16:23:51

标签: c# entity-framework code-first ef-migrations

在我的项目中,我有一个User实体和一个FeeEarner实体,它实际上是某些类型用户拥有的其他属性的集合。所有FeeEarner实例都链接到用户,但并非所有用户都链接到FeeEarner。

我在FeeEarner上有一个虚拟属性,可以导航到用户,该用户可以使用。但是我有一个场景,我真的需要能够从用户导航到用户的FeeEarner(如果存在)。基本上我想做这样的事情:

context.Users.Where(x => x.FeeEarner == null || x.FeeEarner.FirmId == somevalue);

...我希望生成类似这样的SQL(有效):

select [User].* from [User]
left join FeeEarner on [User].id = FeeEarner.UserId
where FeeEarner.FirmId IS NULL OR FeeEarner.FirmId = 'somevalue'

这些实体在已发布的产品中使用非常多,因此我无法在没有太多痛苦的情况下修改数据库结构。我知道我可以用相反的方式编写查询(从FeeEarner开始)但由于各种原因而不适合我在这里瞄准的用户案例。

当我为FeeEnener的User实体添加导航属性时,我得到:

  

无法确定之间关联的主要结束   类型' FeeEarner'和'用户'这个协会的主要目的   必须使用关系fluent API显式配置   或数据注释。

我尝试过各种DataAnnotation和FluentAPI解决方案来强制EF了解我尝试做的事情,例如:

modelBuilder.Entity<FeeEarner>().HasRequired(t => t.User);
modelBuilder.Entity<User>().HasOptional(t => t.FeeEarner).WithOptionalPrincipal(t => t.User);

但结果是:

  

FeeEarner_User_Source ::多重性在角色&#39; FeeEarner_User_Source&#39;中无效。在关系&#39; FeeEarner_User&#39;。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为&#39; *&#39;。

以下是我的实体类(为简洁起见而简化):

public class User {

    [Key]
    public Guid Id { get; set; }

    public virtual FeeEarner FeeEarner { get; set; }

}

public class FeeEarner {

    [Key]
    public Guid Id { get; set; }

    public Guid FirmId { get; set; }

    public Guid UserId { get; set; }

    [ForeignKey(nameof(UserId))]
    public virtual User User { get; private set; }

}

0 个答案:

没有答案