2012-04-11 89 views
1

我正在使用EntityFramework v4.3.1并通过继承自DbContext并覆盖OnModelCreating()通过代码构建我的模型。我有一个表叫公司和一个表消息消息表具有可空的外键消息。公司Id。设置此项时,特定消息与特定公司相关联。当该字段为空时,该消息与所有公司相关联。为可空键外键创建导航属性

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

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

我成功地得到公司的导航性能,使得我可以这样做TestCompany.Messages电话,我得到相关的特定公司的邮件列表。但我也需要返回所有的空消息。

这是如何实现的?

回答

5

如果您想要查询与任何公司无关的消息,您需要在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); 
+0

谢谢 - 我想我被错误地试图模型的创建与查询混合。我现在分离了这些担忧。 – DotNetDeveloper 2012-04-11 14:15:08

+0

这是唯一可能使用流利的API?可以使用数据注释中的'HasOptional'功能吗? – 2013-01-11 00:49:32