我正在尝试使用Fluent API在实体框架核心中建立一对多关系,但没有成功。
我有两个名为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,但对于源,我只得到null。
我看过不同的教程和SOF关于这方面的问题,但我看不出哪里出了问题。
希望有人能对此有所了解。
将Include(msg => msg.Source)
添加到查询中,它将强制加载带有消息
var get = context.Messages.Include(msg => msg.Source).Where(m => m.ID == 1).FirstOrDefault();
有几种方法可以加载相关数据:
急切加载:
表示相关数据作为初始查询的一部分从数据库加载
显式加载:
表示相关数据在以后的中从数据库中显式加载
延迟加载:
意味着当访问导航属性时,相关数据从数据库透明加载
有关更多信息,请参阅EF Core文档。
如果我们采用延迟加载方法,您可以使用UseLazyLoadingProxy((设置选项:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString);
然后使您的导航属性虚拟化:
public virtual Source Source { get; set; }
和
public virtual ICollection<Message> Messages { get; set; }