问题描述
我有两个要通过字符串键连接的EF Core实体,但不遵循id-name-convention。像这样的简单DbContext:
public DbSet<Entity1> Table1 { get; set; }
public DbSet<Entity2> Table2 { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity1>()
.HasOne(s => s.Entity2)
.WithOne()
.HasForeignKey<Entity1>(s => s.Name);
}
public class Entity1
{
public String Name{ get; set; }
public Entity2 Entity2 { get; set; }
}
public class Entity2
{
[Key]
public String Nummer { get; set; }
}
它不会引发任何错误-但是查询数据时,“ Entity2”属性始终为空-即使表2中存在一个数据集,其中“数字”等于Entity1的“名称”值。
我还尝试了不带OnModelCreating-Code的ForeignKey属性-但结果相同。
我认为,我对EF核心中的外键概念有完全的误解。
有什么想法或提示吗?
解决方法
问题可能出在查询过程中。您如何查询数据。除非您通过(?<=[\w])(?:_([a-z]))([^_"]*+)(?!"\s)|"_([a-z]+)"
明确指定,否则EFCore默认不会进行联接查询。例如,
Include()
var entity1 = db.Table1
.Where(x=>x.Name == "test")
.Include(x=>x.Entity2) <--- watch this
.First();
指定两个表之间存在联接查询,并且返回的Include(x=>x.Entity2)
对象包含Entity1
的数据。