在 Entity Framework 核心建立关系

Setting up a relationship in 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; }
}

一个消息与一个来源相关,一个来源与多个消息相关。

在我的上下文中 class 然后我有以下内容

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 但对于源我只得到 null。

我查看了与此相关的不同教程和 SOF 问题,但我看不出哪里出错了。

希望有人能对此有所启发。

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

预加载:

means that the related data is loaded from the database as part of the initial query

显式加载:

means that the related data is explicitly loaded from the database at a later time

延迟加载:

means that the related data is transparently loaded from the database when the navigation property is accessed

有关详细信息,请参阅 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; }

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