通过MySQL.Data.Entity v6.9.9(当前版本)连接MySQL数据库。试图检索所有的列表
表通过直接SQL查询(在MyDBContext
内):
public async Task<IEnumerable<DBTableInfo>> GetTablesAsync()
{
string sql = @"SELECT TABLE_NAME Name, TABLE_ROWS NumRows
FROM information_schema.tables
where TABLE_TYPE='BASE TABLE'
order by TABLE_NAME;";
var result = Database.SqlQuery<DBTableInfo>(sql);
return await result.ToListAsync();
}
DBTableInfo
的定义简单如下:
public class DBTableInfo
{
public string Name { get; set; }
public long NumRows { get; set; }
}
我收到错误:
指定的演员表无效。
违规行是return
方法的GetTableAsync
声明。发生错误的原因是
NumRows
的{{1}}属性。如果我从DBTableInfo
注释掉NumRows
属性,则查询有效。
现在,DBTableInfo
将information_schema.tables
定义为TABLE_ROWS
。我的bigint
对象
将相应的属性声明为DBTableInfo
。即使此列不包含空值,我也尝试使用long
,
它也不起作用。
为什么呢?任何关于处理它的最佳方法的建议都将受到赞赏。
答案 0 :(得分:1)
通过将NumRows
值转换为SQL中的签名版本,问题得以解决(更像是&#34;解决了#34;),如下所示:
CAST(TABLE_ROWS as SIGNED) NumRows
和确保我的课程仍被定义为:
public class DBTableInfo
{
public string Name { get; set; }
public long NumRows { get; set; } // <-- ulong does not work!
}
通过这两个步骤,记录可以正确反序列化。
请注意,您不能使用ulong
(无符号64位整数)作为NumRows
的声明类型,因为 - 事实证明 - 实体框架仍然不支持无符号长整数< / strong>即可。我花了一段时间才重新学习这个。
以下是相关参考资料:
How to use unsigned int / long types with Entity Framework?
因此,您必须两者将数据库中的unsigned long值转换为签名版本,和将类的接收成员声明为(signed){{ 1}}。
不幸的是,这使得MySQL方面的溢出错误空间开放。幸运的是,我的表格远不及那些会成为真正问题的行数。