为啥 Entity Framework Raw Sql Query 从 MySql 返回具有不需要值的对象?

Posted

技术标签:

【中文标题】为啥 Entity Framework Raw Sql Query 从 MySql 返回具有不需要值的对象?【英文标题】:Why does EntityFramework Raw SqlQuery returns objects from MySql with undesired values?为什么 Entity Framework Raw Sql Query 从 MySql 返回具有不需要值的对象? 【发布时间】:2018-09-16 23:51:55 【问题描述】:

当我对 DBContext 运行 RawSqlQuery 以从 mysql 数据库中获取 List Objects 时,这些对象不会以它们在数据库中的真实值返回。列表中的所有对象在查询后都具有所有属性的默认值。

代码:

using (var dbContext=new PartnerEntities())
        
            string sql = $@"select idcall,starttime from cdr limit 0,100";
            List<KeyValuePair<long,DateTime>> rowIdVsDates =
                dbContext.Database.SqlQuery<KeyValuePair<long,DateTime>>(sql).ToList();
        

检索到的结果:Results from debug:

原始数据:idcall,开始时间 1、'2017-12-01 22:56:38' 2、'2017-12-01 22:56:33' 3、'2017-12-01 22:56:44' 4、'2017-12-01 22:56:14' 5、'2017-12-01 22:56:49' 6、'2017-12-01 22:56:34' 7、'2017-12-01 22:56:41' 8、'2017-12-01 22:56:25' 9、'2017-12-01 22:56:39'

根据 EF 文档,我想要实现的目标应该是可能的。 EF Documentation from MSDN

来自链接:

可以使用 Database 类上的 SqlQuery 方法创建返回任何类型实例的 SQL 查询,包括原始类型。 例如:使用 (var context = new BloggingContext()) var blogNames = context.Database.SqlQuery( "从 dbo.Blogs 中选择名称").ToList();

我使用 EntityFramework 6.1.3 和 C#,MySql 5.6 for windows,连接器 .net 6.9.8。我将 EF 更新到 6.2.0(最新),但这并没有解决问题。

您的帮助将不胜感激。

【问题讨论】:

根据我的经验,.net 的 MySQL 连接器非常值得怀疑。最终我发现有必要远离他们。我建议使用 SqlProvider 将其连接到测试 MSSQL 数据库,并查看是否生成了正确的数据集。如果是这样,那么 MySQL 连接器中存在错误,而不是实体框架。 是的,MySQL 连接器似乎有很多问题。我只使用原始 sql 选项(无 EF) 你的问题是 KeyValuePair 不能与 SqlQuery 一起使用 - 请参阅 this answer;您应该创建自己的类或返回某些内容(ValueTuple?)并使用 LINQ Select 将其转换为 KeyValuePair - 您还需要与列名匹配的属性设置器。 【参考方案1】:

KeyValue 对类型不正确。它与属性名称匹配。您应该改用自定义类型。例如:

编辑:更改类型以匹配您的用例

public class MyDto

    public int IdCall  get; set; 
    public DateTime StartTime  get; set; 

那么您的查询将如下所示:

var rowIdVsDates = dbContext.Database.SqlQuery<MyDto>(sql).ToList();

【讨论】:

我接受这个作为答案,但是原始 Sql Query 中的列名必须与类 (myDto) 的属性名匹配,因此如果需要,应在 Sql 中使用列别名,如本例:string sql = $@"select idcall as IdCall,starttime as StartTime from cdr limit 0,100";对此进行了测试,一切正常。

以上是关于为啥 Entity Framework Raw Sql Query 从 MySql 返回具有不需要值的对象?的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework,RAW 字段无法正常工作

为啥 Entity framework Entity Master Details Entity Edit

为啥我的 Entity Framework Code First 代理集合为空,为啥我不能设置它?

为啥要使用 Attach 来更新 Entity Framework 6?

为啥在我运行迁移时 Entity Framework 包会自动更新?

为啥我必须为 Code First / Entity Framework 提供无参数构造函数