context.MyContext.SqlQuery()从上下文的OnModelCreating()跳过映射逻辑?

时间:2019-02-05 14:22:42

标签: c# .net postgresql entity-framework entity-framework-6

我刚开始使用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方法中已经存在的逻辑?

1 个答案:

答案 0 :(得分:0)

  

为什么这种方法不像其他所有情况那样考虑OnModelCreating方法中已经存在的逻辑?

这是EF6中的限制。从原始SQL查询加载时,EF Core会尊重您的列映射:

  

结果集中的列名称必须与以下内容匹配:   属性映射到。请注意,这与EF6不同,   原始SQL查询和结果集的属性/列映射被忽略   列名称必须与属性名称匹配。

Raw SQL Queries (EF Core)