c# - 在 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 问题,但我看不出哪里出错了。
希望有人可以对此有所了解。
解决方案
加载相关数据有几种方式:
急切加载:
表示相关数据是作为初始查询的一部分从数据库中加载的
显式加载:
表示稍后从数据库中显式加载相关数据
延迟加载:
表示在访问导航属性时,透明地从数据库中加载相关数据
有关详细信息,请参阅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; }
推荐阅读
- python - 延迟首付python的抵押贷款月供
- subquery - Ecto:子查询和存在
- node.js - nodejs -- 强制移动一个繁忙的目录
- angular - 如何使用 Angular 和 rxjs 保持长时间运行的 http post 请求?
- python - 正则表达式删除列数据框python中字符串的特定部分
- javascript - 从 div 获取 innerHTML 值 onclick(在 javascript 中)
- azure - 如何使用 Azure CDN 交付具有根域的整个站点?
- python - 简单的问题。如何将python列表转换为在sqlite查询中成功使用它
- html - 标签错误地位于输入下方
- swift - Swift:静态变量突然变成 Nil