EF Core联表查询的一次坑

背景

使用EF Core 对一个一对多关系的表进行查询,通过多关联查询一的时候可以正常查询出结果,而反过来则就会一直出现sql错误。通过打印sql发现,是在进行LEFT JOIN 的时候外键字段名称在表中并不存在。

具体详情

因为实际中模型字段过多,以下为简化版本。

实体

有俩个实体,分别对应数据库中俩张表,分别为Person,Book,其关系是一个Person能够拥有多个Book,Entity代码如下。

public class Person
{
	public int Id {get;set;}
	public string Name {get;set;}
	public virtual ICollection<Book> Books {get;set;}
}

public class Book
{
	public int Id {get;set;}
	public string BookName {get;set;}
	public Person Person {get;set;}
	public int PersonId {get;set;
}

EF Core 关系配置

这里配置Book的关系即可以。

var b = builder.Entity<Book>();
b.HasOne(p => p.Person)
  .WithMany()
  .IsRequired()
  .HasForeignKey(p => p.PersonId);

查询

通过Book来关联查询Person,查询结果正常。

var books = await _repository.GetAll()
        .Include(x => x.Person)
        .ToListAsync();

通过Person关联查询Book,查出个人所拥有的全部书籍则会出现sql异常。

var results = await _repository.GetAll()
        .Include(x => x.Book)
        .ToListAsync();

此时控制台会出现 Unknown column ‘v0.PersonId1’ in 'field list’

解决

通过不断尝试,发现是在配置的时候WithMany()中对Book的关系,在其中加上p => p.Book即可更改后如下:

var b = builder.Entity<Book>();
b.HasOne(p => p.Person)
  .WithMany(p => p.Book)
  .IsRequired()
  .HasForeignKey(p => p.PersonId);

你可能感兴趣的:(C#学习,问题集锦,sql,orm,.net,数据库,mysql)