在实体框架核心中建立关系



我正在尝试使用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; }

相关内容

  • 没有找到相关文章

最新更新