Entity Framework: 如何使用 Fluent 将列的类型设置为 uniqueidentifier API
Entity Framework: how to set the type of a column as uniqueidentifier with Fluent API
我用Entity Framework6,代码优先
我有一个由框架 (Azure Mobile Server SDK) 创建的列 <string> Id
,我无权访问它。
public abstract class EntityData
{
[Key]
[TableColumn(TableColumnType.Id)]
public string Id { get; set; }
...
}
如果我不执行任何操作,此类列将映射为 SQL 服务器中的 nvarchar(MAX)
。
我已经能够在 Fluent API:
中使用这个片段将它变成 char(36)
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 。一些旁注 - 你应该创建一个继承自这个抽象 class 的 class。这不仅提供了一个抽象层,还允许您更精确地控制存储和访问数据的方式。另外,您可能已经知道,GUID 会产生可怕的 PK!
编辑:
如果您使用的是 EF 6,则此功能将不可用。因此,您需要创建包装器 属性 或使用存储过程。这是一个例子,示例代码可以在这里找到:https://github.com/ibrahm2/entityframework6-map-string-to-guid
方法一:包装器属性
- 创建一个继承自
EntityData
的 class。对于这个例子,我们称它为 WrapperTable
例如
- 添加一个名为
Id
且类型为 Guid
的 属性 并使用 new
修饰符屏蔽基数 Id
属性。让它 return 从基础 class 中转换为 Id
的 Guid
。这将掩盖基地 属性。这不是最佳实践,因此如果您对此感到不满意table,替代方法是创建一个新的 属性,例如称为 Key
环绕 Id
.
如果你的配置,将继承的class映射到EntityDate
table。
modelBuilder.Entity().ToTable("EntityData");
方法二:存储过程
- 创建一个存储过程,将 varchar 作为 Id 字段的参数
将存储过程映射到实体的插入函数例如:
modelBuilder.Entity().MapToStoredProcedures(prop=>prop.Insert(sp=>sp.HasName("sp_InsertTable").参数(pm => pm.Id , "@id")));
让存储过程将 varchar 插入到您的 uniqueidentifier 字段中。
给你:
modelBuilder.Entity<TodoItem>().Property(t => t.Id).HasColumnType("UniqueIdentifier");
更多信息供您参考:
我用Entity Framework6,代码优先
我有一个由框架 (Azure Mobile Server SDK) 创建的列 <string> Id
,我无权访问它。
public abstract class EntityData
{
[Key]
[TableColumn(TableColumnType.Id)]
public string Id { get; set; }
...
}
如果我不执行任何操作,此类列将映射为 SQL 服务器中的 nvarchar(MAX)
。
我已经能够在 Fluent API:
中使用这个片段将它变成char(36)
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 。一些旁注 - 你应该创建一个继承自这个抽象 class 的 class。这不仅提供了一个抽象层,还允许您更精确地控制存储和访问数据的方式。另外,您可能已经知道,GUID 会产生可怕的 PK!
编辑:
如果您使用的是 EF 6,则此功能将不可用。因此,您需要创建包装器 属性 或使用存储过程。这是一个例子,示例代码可以在这里找到:https://github.com/ibrahm2/entityframework6-map-string-to-guid
方法一:包装器属性
- 创建一个继承自
EntityData
的 class。对于这个例子,我们称它为WrapperTable
例如 - 添加一个名为
Id
且类型为Guid
的 属性 并使用new
修饰符屏蔽基数Id
属性。让它 return 从基础 class 中转换为Id
的Guid
。这将掩盖基地 属性。这不是最佳实践,因此如果您对此感到不满意table,替代方法是创建一个新的 属性,例如称为Key
环绕Id
. 如果你的配置,将继承的class映射到
EntityDate
table。modelBuilder.Entity().ToTable("EntityData");
方法二:存储过程
- 创建一个存储过程,将 varchar 作为 Id 字段的参数
将存储过程映射到实体的插入函数例如:
modelBuilder.Entity().MapToStoredProcedures(prop=>prop.Insert(sp=>sp.HasName("sp_InsertTable").参数(pm => pm.Id , "@id")));
让存储过程将 varchar 插入到您的 uniqueidentifier 字段中。
给你:
modelBuilder.Entity<TodoItem>().Property(t => t.Id).HasColumnType("UniqueIdentifier");
更多信息供您参考: