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

方法一:包装器属性

  1. 创建一个继承自 EntityData 的 class。对于这个例子,我们称它为 WrapperTable 例如
  2. 添加一个名为 Id 且类型为 Guid 的 属性 并使用 new 修饰符屏蔽基数 Id 属性。让它 return 从基础 class 中转换为 IdGuid。这将掩盖基地 属性。这不是最佳实践,因此如果您对此感到不满意table,替代方法是创建一个新的 属性,例如称为 Key 环绕 Id.
  3. 如果你的配置,将继承的class映射到EntityDatetable。

    modelBuilder.Entity().ToTable("EntityData");

方法二:存储过程

  1. 创建一个存储过程,将 varchar 作为 Id 字段的参数
  2. 将存储过程映射到实体的插入函数例如:

    modelBuilder.Entity().MapToStoredProcedures(prop=>prop.Insert(sp=>sp.HasName("sp_InsertTable").参数(pm => pm.Id , "@id")));

  3. 让存储过程将 varchar 插入到您的 uniqueidentifier 字段中。

给你:

 modelBuilder.Entity<TodoItem>().Property(t => t.Id).HasColumnType("UniqueIdentifier");

更多信息供您参考:

Configuring the Data Type of a Database Column