entity-framework-6 - 实体框架:如何使用 Fluent API 将列的类型设置为 uniqueidentifier
问题描述
我使用实体框架 6,代码优先。
我有一个<string> Id
由我无权访问的框架(Azure Mobile Server SDK)创建的列。
public abstract class EntityData
{
[Key]
[TableColumn(TableColumnType.Id)]
public string Id { get; set; }
...
}
如果我不执行任何操作,则此类列将nvarchar(MAX)
在 SQL Server 中映射为 a。
我已经能够char(36)
用 Fluent API 中的这个片段把它变成一个:
PropertyConventionConfiguration pkConf = modelBuilder.Properties<string>().Where(p => p.Name == "Id");
pkConf.Configure(p => p.IsUnicode(false));
pkConf.Configure(p => p.HasMaxLength(36));
pkConf.Configure(p => p.IsFixedLength());
我想将其设置为uniqueidentifier
.
如何使用类似的 Fluent API 代码片段来做到这一点?
非常感谢!
解决方案
您可以使用自定义值转换器或利用内置的GuidToStringConverter:docs.microsoft.com/en-us/ef/core/modeling/value-conversions。一些旁注——你应该创建一个继承自这个抽象类的类。这不仅提供了抽象层,还允许您更精确地控制存储和访问数据的方式。此外,您可能知道,GUID 会产生可怕的 PK!
编辑:
如果您使用的是 EF 6,则此功能将不可用。因此,您将需要创建包装属性或使用存储过程。这是一个示例,示例代码可以在这里找到:https ://github.com/ibrahm2/entityframework6-map-string-to-guid
方法一:包装器属性
- 创建一个继承自
EntityData
. 对于这个例子,我们称之为WrapperTable
eg - 添加一个名为
Id
type的属性,并使用修饰符Guid
屏蔽基本属性。让它从基类返回一个转换版本为. 这将掩盖基本属性。这不是最佳实践,因此如果您对此感到不舒服,另一种选择是创建一个新属性,例如称为that wraps around 。Id
new
Id
Guid
Key
Id
如果您的配置,将继承的类映射到
EntityDate
表。modelBuilder.Entity().ToTable("EntityData");
方法二:存储过程
- 创建一个将 varchar 作为 Id 字段参数的存储过程
将存储过程映射到实体的插入函数,例如:
modelBuilder.Entity().MapToStoredProcedures(prop=>prop.Insert(sp=>sp.HasName("sp_InsertTable").Parameter(pm => pm.Id, "@id")));
让存储过程将 varchar 插入到您的 uniqueidentifier 字段中。
推荐阅读
- xml - 使用 Notepad++ 在 XSD 验证中出现错误
- swift - 如何在 UICollectionViewController 中触发 UICollectionViewCell 的功能?
- javascript - Chrome 扩展错误 Unchecked runtime.lastError: 无法建立连接。接收端不存在
- asp.net-core - 将 int 呈现为枚举而不是创建枚举类型招摇
- android - Android Mapbox Navigation - 当用户在同一位置时,有时不会初始化,有时会崩溃
- php - 使用 PHP_EOL 在 txt 文件中写入数据时如何摆脱空间
- android - 在 64 位版本的 Lubuntu 上安装 Android Studio 无法安装一些 32 位库
- javascript - 设置 chrome 代理设置表单扩展
- angular - 单击行时扩展 prime-ng 的 p-table 行
- javascript - 当 --language_out 设置为 ECMASCRIPT_2015 时,Google Closure Compiler 将“use strict”添加到结果文件