为啥 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 返回具有不需要值的对象?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Entity framework Entity Master Details Entity Edit
为啥我的 Entity Framework Code First 代理集合为空,为啥我不能设置它?
为啥要使用 Attach 来更新 Entity Framework 6?