我试图使用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问题,但是我看不到哪里出了问题。
希望有人可以对此有所启发。
答案 0 :(得分: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; }
答案 1 :(得分:2)
将Include(msg => msg.Source)
添加到查询中,这将迫使其加载
与消息
var get = context.Messages.Include(msg => msg.Source).Where(m => m.ID == 1).FirstOrDefault();