【问题标题】:context.MyContext.SqlQuery() skips mapping logic from context's OnModelCreating()?context.MyContext.SqlQuery() 从上下文的 OnModelCreating() 中跳过映射逻辑?
【发布时间】: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


    【解决方案1】:

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

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

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

    Raw SQL Queries (EF Core)

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 2012-07-16
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多