最近使用entityframewok生成數據庫,使用dapper來訪問數據庫,產生了一個意外的bug,下面是產生bug的示例以及解決方案。
由於用entityframework生成數據庫,默認情況entityframewok 將bool?轉換為tinyint(1),
使用dapper查詢數據時報錯(部分數據為空,部分數據不為空,且查詢出來的第一條是可為空的數據才會出現問題,否則不會報錯)。
1、定義一個類:
public class BugNullable
{
public int ID { get; set; }
public string Name { get; set; }
public bool? IsBug { get; set; }
public DateTime? UpdatedTime { get; set; }
}
2、生成數據庫表
CREATE TABLE `bugnullable` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL DEFAULT '0',
`IsBug` TINYINT(1) NULL DEFAULT NULL,
`UpdatedTime` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`ID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;
3、填充數據
INSERT INTO `bugnullable` (`ID`, `Name`, `IsBug`, `UpdatedTime`) VALUES
(1, 'test', NULL, NULL),
(2, 'test1', 1, '2017-01-14 10:05:15');
4、dapper .net 測試代碼
class Program
{
static void Main(string[] args)
{
/// <summary>
/// 數據庫連接串
/// </summary>
var connectionString = ConfigurationManager.AppSettings["DefaultConnection"].Trim();
using (var conn = new MySqlConnection(connectionString))
{
//var bugs = conn.Query<BugNullable>("select * from BugNullable order by ID asc;").ToList(); no bug
SqlMapper.GridReader gr = conn.QueryMultiple("select * from BugNullable order by ID asc;");//bug
var bugs = gr.Read<BugNullable>().ToList();
bugs.ForEach(h => {
Console.WriteLine($"ID:{h.ID},Name:{h.Name},IsBug:{h.IsBug},UpdatedTime:{h.UpdatedTime}");
});
conn.Close();
}
Console.ReadLine();
}
}
public class BugNullable
{
public int ID { get; set; }
public string Name { get; set; }
public bool? IsBug { get; set; }
public DateTime? UpdatedTime { get; set; }
}
5、結果
6、解決方案:修改數據庫字段大小(將bool對應的tinyint(1)適當擴大,如tinyint(2)或者bit(1))。