Dapper.Rainbow Database.Insert - 从对象中删除 Id - 如何覆盖?
Posted
技术标签:
【中文标题】Dapper.Rainbow Database.Insert - 从对象中删除 Id - 如何覆盖?【英文标题】:Dapper.Rainbow Database.Insert - removes Id from object - how to override? 【发布时间】:2018-07-31 08:54:59 【问题描述】:我将 Dapper 和 Dapper.Rainbow 用于我的 ORM(只是从 EF 切换到它)。
我的表有 Guids/uniqueidentifiers 作为 ID。
我正在使用 Dapper Rainbow 进行插入,它正在删除 Id 参数。
参见插入方法的第 62 行... https://github.com/StackExchange/Dapper/blob/master/Dapper.Rainbow/Database.cs
/// <summary>
/// Insert a row into the db
/// </summary>
/// <param name="data">Either DynamicParameters or an anonymous type or concrete type</param>
/// <returns></returns>
public virtual int? Insert(dynamic data)
var o = (object)data;
List<string> paramNames = GetParamNames(o);
paramNames.Remove("Id");
string cols = string.Join(",", paramNames);
string colsParams = string.Join(",", paramNames.Select(p => "@" + p));
var sql = "set nocount on insert " + TableName + " (" + cols + ") values (" + colsParams + ") select cast(scope_identity() as int)";
return database.Query<int?>(sql, o).Single();
那么虽然该方法被标记为virtual,但我应该如何覆盖它呢?
GetParamNames 等所有其他必需方法都是内部的,所以最好只克隆并运行我自己的 Dapper.Rainbow 版本?
【问题讨论】:
【参考方案1】:Dapper.Rainbow 很少有limitations:
不支持复合键映射。 所有表的标识列名称必须称为 Id。它希望 Id 是身份,所以它会删除它们...
作为替代方案,您可以尝试Dapper-Extensions,它同时支持整数和 Guid 主键。或者只使用 Dapper 而不需要额外的 CRUD 扩展...
【讨论】:
嗨@Void-Ray - 我想你误解了我的问题问题。我的 ID 被称为 ID,我没有使用复合键映射。我的 ID 是 Guid,我在代码(不是 sql)中设置的,Rainbow 不遵守插入时设置的 Id 值。 对,据我所知,它只支持数字标识(SQL 服务器将在插入时自动分配下一个值)ID 这就是它删除它的原因。以上是关于Dapper.Rainbow Database.Insert - 从对象中删除 Id - 如何覆盖?的主要内容,如果未能解决你的问题,请参考以下文章
Dapper.Rainbow Database.Insert - 从对象中删除 Id - 如何覆盖?
数据库设计11 important database designing rules which I follow