【发布时间】:2014-06-04 19:33:01
【问题描述】:
我首先使用实体框架代码来访问一组表,其键将由默认约束中基于 int 的 SEQUENCE 设置。 EF 似乎无法处理这个问题,它坚持在插入后使用 SCOPE_IDENTITY 来填充整数键字段。
深入研究代码,它看起来有点硬编码:
在页面的一半多一点处查看 IsValidScopeIdentityColumnType 方法。如果此方法返回 true,则使用 SCOPE_IDENTITY() 检索插入的 Key 值,否则生成 OUTPUT 子句。 (Guid/uniqueidentifier 是那里的典型用例)。
// make sure it's a primitive type
if (typeUsage.EdmType.BuiltInTypeKind != BuiltInTypeKind.PrimitiveType)
{
return false;
}
// check if this is a supported primitive type (compare by name)
var typeName = typeUsage.EdmType.Name;
// integer types
if (typeName == "tinyint"
|| typeName == "smallint"
||
typeName == "int"
|| typeName == "bigint")
{
return true;
}
有没有什么办法可以欺骗这个方法为一个整数字段返回 false ?一旦我开始看到诸如“EDMType”之类的东西,我就无法真正理解 EF 映射是如何工作的。也许有一些方法可以使用用户定义的类型来欺骗它?但确实是 .NET 端的配置需要某种更新。
另请参阅同一文件中的 UseGeneratedValuesVariable 方法以了解其使用位置...
我不清楚为什么这里不只是全面使用 OUTPUT —— 也许是性能?
【问题讨论】:
-
“我不清楚为什么这里不全面使用 OUTPUT”——正如在
UseGeneratedValuesVariable方法中的 cmets 中所述,在您找到的同一个文件中,OUTPUT 没有'对于旧版本的 SQL Server 不存在。此外,即使使用较新的版本,我认为在某些情况下 OUTPUT 不起作用(与触发器有关)。 -
他们实际上在某些地方检查了 SQL 的版本......但是触发器......总是一个问题
标签: c# entity-framework