【问题标题】:Setting up a relationship in Entity Framework Core在 Entity Framework Core 中建立关系
【发布时间】:2018-11-09 11:41:14
【问题描述】:

我正在尝试使用 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-core ef-fluent-api


    【解决方案1】:

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

    【讨论】:

      【解决方案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; }
      

      【讨论】:

      • 我看不到 UseLazyLoadingProxies()。我是否缺少依赖项?
      • @RichardBoyce 所有这些都在文档链接中进行了解释(包括代理包)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      相关资源
      最近更新 更多