实体框架核心始终返回外部行的空列表



我正在使用实体框架核心和 ASP.NET 核心3.1。

我有两个简单的模型:

public class UserModel 
{
public int    UserModelId   { get; set; }
public string Email         { get; set; }
public string Password      { get; set; }
public string Name          { get; set; }
public string Surname       { get; set; }
public string Token         { get; set; }
public List<TherapyModel> Therapies { get; set; }
}
public class TherapyModel 
{
public int      TherapyModelId  { get; set; }
public int      UserModelId     { get; set; }
public string   Title           { get; set; }
public int      Quantity        { get; set; }
public bool     Monday          { get; set; }
public bool     Tuesday         { get; set; }
public bool     Wednesday       { get; set; }
public bool     Thursday        { get; set; }
public bool     Friday          { get; set; }
public bool     Saturday        { get; set; }
public bool     Sunday          { get; set; }
public string   ImgBase64       { get; set; }
public string   ImgUrl          { get; set; }
public int UserModelForeignKey { get; set; }
public UserModel UserModel           { get; set; }
}

现在,我以这种方式初始化所有内容:

public class DatabaseManager : DbContext 
{
//Entities:
public DbSet<UserModel>     UserModel    { get; set; }
public DbSet<TherapyModel>  TherapyModel { get; set; }
protected override void OnModelCreating( ModelBuilder modelBuilder ) 
{
modelBuilder.Entity<TherapyModel>().HasOne(p => p.UserModel)
.WithMany(s => s.Therapies)
.HasForeignKey(p => p.UserModelForeignKey);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseMySql( @"Server=127.0.0.1;database=test2;uid=root;pwd=" ); );
}

使用正确的外键正确填充本地数据库。实际上,此查询返回 3 行:

select * 
from usermodel 
join therapymodel on therapymodel.UserModelForeignKey 

但是,出于某种原因,当我尝试从 C# 代码中获取UserModel时,这始终将"疗法"返回为 NULL。我可以通过以下两种方式UserModel

UserModel user = dbManager.UserModel.FirstOrDefault( user => user.UserModelId == iUserModel.UserModelId );
var users = dbManager.UserModel;

用户和用户的治疗均为NULL。我真的不明白为什么。有什么帮助吗?

好的,我终于找到了答案。通过阅读这篇文章:

https://www.learnentityframeworkcore.com/lazy-loading

我启用了延迟加载(默认情况下启用(,但外键必须是虚拟的:

public class Author
{
public int AuthorId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual List<Book> Books { get; set; } = new List<Book>();
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public int AuthorId { get; set; }
public virtual Author Author { get; set; }
}

现在它可以工作了,Microsoft教程不会告诉您有关延迟加载以及将外键声明为虚拟的事实。我希望这可以帮助将来的任何人。

我知道这个线程很旧,但我遇到了类似的问题,发现放弃双向模型关系对我来说是最干净的解决方案。

因此,对于那些认为多对一参考是多余的人,这是我的解决方案:

public class UserModel 
{
// ...
public List<TherapyModel> Therapies { get; set; } = new List<TherapyModel>();
}
public class TherapyModel 
{
// ...
public int UserModelForeignKey { get; set; }
// I Dropped the UserModel here [public UserModel UserModel { get; set; }]
}
// ... Note OnModelCreating : HasOne(p => p.UserModel) => HasOne<UserModel>()
protected override void OnModelCreating(ModelBuilder modelBuilder) 
{
modelBuilder
.Entity<TherapyModel>()
.HasOne<UserModel>()
.WithMany(user => user.Therapies)
.HasForeignKey(thp => thp.UserModelForeignKey);
}

你需要急切加载Therapies,像这样:

UserModel user = dbManager.UserModel.Where( user => user.UserModelId == iUserModel.UserModelId ).Include( user => user.Therapies ).SingleOrDefault();

之所以使用SingleOrDefault是因为,当您按主键查询时,实际上最多应该只有一条记录。 在此处查看更多信息:https://learn.microsoft.com/en-us/ef/core/querying/related-data。

最新更新