在我的项目中,我有一个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; }
}