在Entity Framework Core中建立关系

时间:2018-11-09 11:41:15

标签: c# entity-framework-core ef-fluent-api

我试图使用Fluent API在Entity Framework Core中建立一对多关系,但没有成功。

我有两个对象,分别称为Message和Source,并且定义为

public class Message
{
    public int ID { get; set; }
    public int FromUserID { get; set; }
    public int ToUserID { get; set; }
    public int SourceID { get; set; }
    public int Priority { get; set; }
    public string Subject { get; set; }
    public string MessageBody { get; set; }
    public DateTime DateTimeCreated { get; set; }
    public DateTime? DateTimeDelivered { get; set; }
    public Source Source { get; set; }
}

public class Source
{
    public int ID { get; set; }
    public string Name { get; set; }
    public ICollection<Message> Messages { get; set; }
}

带有与一个消息源相关的一条消息和与多个消息有关的一个源。

在我的上下文类中,我有以下内容

public DbSet<Message> Messages { get; set; }

public DbSet<Source> Sources { get; set; }

然后将关系定义为

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...

    modelBuilder.Entity<Message>()
            .HasOne<Source>(m => m.Source)
            .WithMany(s => s.Messages);

}

如果我使用以下内容对此进行测试

var get = context.Messages.Where(m => m.ID == 1).FirstOrDefault();

我的问题是我得到的消息为OK,但对于源我只是为空。

我看过与此有关的其他教程和SOF问题,但是我看不到哪里出了问题。

希望有人可以对此有所启发。

2 个答案:

答案 0 :(得分:2)

有几种加载相关数据的方法:

渴望加载:

  

表示相关数据是作为初始查询的一部分从数据库中加载的

显式加载:

  

表示稍后会从数据库中显式加载相关数据

延迟加载:

  

表示访问导航属性时从数据库透明地加载相关数据

有关更多信息,请参见EF Core docs

如果我们采用延迟加载方法,则可以使用UseLazyLoadingProxies()设置选项:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
    .UseLazyLoadingProxies()
    .UseSqlServer(myConnectionString);

...然后将您的导航属性设为虚拟:

public virtual Source Source { get; set; }

public virtual ICollection<Message> Messages { get; set; }

答案 1 :(得分:2)

Include(msg => msg.Source)添加到查询中,这将迫使其加载 与消息 var get = context.Messages.Include(msg => msg.Source).Where(m => m.ID == 1).FirstOrDefault();