背景
使用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);