我刚开始使用EntityFramework 6,但仍在尝试一些方案。我在上下文类中重写了OnModelCreating()方法,并且对某些将列名映射到属性的方法有一些逻辑:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
modelBuilder.Entity<Ninja>().Property(x => x.DateOfBirth).HasColumnName("date_of_birth");
}
如您所见,属性名称为DateOfBirth,而数据库中的相应列为date_of_birth。现在,当我在数据库中添加/插入新数据时,此映射可以正常工作。当我查询/检索这样的数据时:
var ninja = context.Ninjas.FirstOrDefault(n => n.Name.StartsWith("Kacy"));
它工作正常。
但是当我想使用DB(postgre 10)函数来检索数据时:
private static void RetrieveDataWithStoredProc()
{
using (var context = new NinjaContext())
{
context.Database.Log = Console.WriteLine;
var ninjas = context.Ninjas.SqlQuery("select * from get_old_ninjas()").ToList();
}
}
我收到以下异常:
The data reader is incompatible with the specified 'NinjaDomain.DataModel.Ninja'.
A member of the type, 'DateOfBirth', does not have a corresponding column in the data reader with the same name.
这意味着它没有考虑模型构建器中有关DateOfBirth属性的列名的逻辑。 如果我在SqlQuery之后添加显式映射逻辑,它将起作用...
我的问题是,为什么这种方法不像其他所有情况那样考虑OnModelCreating
方法中已经存在的逻辑?
答案 0 :(得分:0)
为什么这种方法不像其他所有情况那样考虑OnModelCreating方法中已经存在的逻辑?
这是EF6中的限制。从原始SQL查询加载时,EF Core会尊重您的列映射:
结果集中的列名称必须与以下内容匹配: 属性映射到。请注意,这与EF6不同, 原始SQL查询和结果集的属性/列映射被忽略 列名称必须与属性名称匹配。