首页 > 解决方案 > 在 Entity Framework Core 中建立关系

问题描述

我正在尝试使用 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 问题,但我看不出哪里出错了。

希望有人可以对此有所了解。

标签: c#entity-framework-coreef-fluent-api

解决方案


加载相关数据有几种方式:

急切加载:

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

显式加载:

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

延迟加载:

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

有关详细信息,请参阅EF Core 文档

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

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

...然后使您的导航属性虚拟化:

public virtual Source Source { get; set; }

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

推荐阅读