【发布时间】:2019-02-05 14:22:42
【问题描述】:
我刚刚开始使用 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 方法中已经存在的逻辑?
【问题讨论】:
标签: c# .net postgresql entity-framework entity-framework-6