首页 > 解决方案 > 实体框架:如何使用 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 代码片段来做到这一点?

非常感谢!

标签: entity-framework-6azure-mobile-servicesuniqueidentifieref-fluent-apief-code-first-mapping

解决方案


您可以使用自定义值转换器或利用内置的GuidToStringConverterdocs.microsoft.com/en-us/ef/core/modeling/value-conversions。一些旁注——你应该创建一个继承自这个抽象类的类。这不仅提供了抽象层,还允许您更精确地控制存储和访问数据的方式。此外,您可能知道,GUID 会产生可怕的 PK!

编辑:

如果您使用的是 EF 6,则此功能将不可用。因此,您将需要创建包装属性或使用存储过程。这是一个示例,示例代码可以在这里找到:https ://github.com/ibrahm2/entityframework6-map-string-to-guid

方法一:包装器属性

  1. 创建一个继承自EntityData. 对于这个例子,我们称之为WrapperTableeg
  2. 添加一个名为Idtype的属性,并使用修饰符Guid屏蔽基本属性。让它从基类返回一个转换版本为. 这将掩盖基本属性。这不是最佳实践,因此如果您对此感到不舒服,另一种选择是创建一个新属性,例如称为that wraps around 。IdnewIdGuidKeyId
  3. 如果您的配置,将继承的类映射到EntityDate表。

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

方法二:存储过程

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

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

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


推荐阅读