为可空外键创建导航属性

Posted

技术标签:

【中文标题】为可空外键创建导航属性【英文标题】:Creating Navigation Property for Nullable Foreign Key 【发布时间】:2012-04-11 11:48:18 【问题描述】:

我正在使用 EntityFramework v4.3.1 并通过从 DbContext 继承并覆盖 OnModelCreating() 的代码构建我的模型。我有一个名为 Companies 的表和一个名为 Messages 的表。 Messages 表有一个可为空的外键 Messages.CompanyId。设置后,特定消息将与特定公司相关联。当此字段为空时,该消息与所有公司关联。

我的问题是我不知道如何在 OnModelCreating() 方法中表达这种行为。如果我这样做:

modelBuilder.Entity<Message>().HasRequired(o => o.Company).WithMany(o => o.Messages).Map(o => o.MapKey("CompanyId"));

我成功地获得了 Company 的导航属性,这样我就可以进行 TestCompany.Messages 之类的调用,并获得与特定公司关联的消息列表。但我还需要返回所有空消息。

如何做到这一点?

【问题讨论】:

【参考方案1】:

如果要查询与任何公司无关的消息,则需要在 Message 实体类中对标量属性 CompanyId 进行建模。

public class Message

    //other porperties

    public int? CompanyId  get; set; 

并使用HasOptional而不是HasRequired配置关系。

modelBuilder.Entity<Message>()
    .HasOptional(o => o.Company).WithMany(o => o.Messages)
    .HasForeignKey(m => m.CompanyId);

然后你可以使用查询

var messages = db.Messages.Where(m => m.CompanyId == null);

【讨论】:

谢谢 - 我想我错误地将模型创建与查询混合在一起。我现在已经把这些顾虑分开了。 这只能使用fluent api吗?可以从数据注释中使用HasOptional 功能吗?

以上是关于为可空外键创建导航属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将十进制变量转换为可空类型

Laravel 5.2 迁移:无法添加 char 数据类型的外键

数据库建模:按实体类型的空外键

实体框架代码优先空外键

关于可空类型到基础类型的转换 问题

EF6:导航属性外键到外键