您如何正确处理 Entity Framework Core 中的 SQL_VARIANT?
How do you properly handle SQL_VARIANT in Entity Framework Core?
最近似乎已将支持添加到 .NET Core 2.1 (preview)
中的 Entity Framework 核心,以允许映射 SQL_VARIANT
列 (https://github.com/aspnet/EntityFrameworkCore/issues/7043)。
看起来这样做的方法是使用新的 HasConversion()
方法 (https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions)。
因此,为了映射我的 SQL_VARIANT
列并将基础数据类型视为任意长度的 VARCHAR
(此时我只关心读取它),我可以执行以下(这里的 Value
属性 在模型中属于 object
类型):
entity.Property(e => e.Value).HasConversion(v => v.ToString(),
v => v.ToString());
如果 SQL_VARIANT
的基础数据类型是任意长度的 VARCHAR
,则此方法有效。
但是,作为 SQL_VARIANT
,该列可以包含其他类型的数据,例如 DATETIME
个值。
为简单起见,我在这里只指定了 DateTime
和 string
,但理论上我可能希望支持映射 [=14= 中可以存储的任何内容所必需的数据类型] 列,如果可能的话。
我将如何确定我想在运行时映射到这两种类型(string
和 DateTime
)中的哪一种?有办法吗?
据我了解,目前的方法是:
// where e.Value is property of type "object"
entity.Property(e => e.Value).HasColumnType("sql_variant");
仅此而已,不需要任何自定义转换器。作为添加此功能的 pull 消息指出:
The type mapper will now map properties to sql_variant columns if:
- The property is type object
- The store type name is specified as sql_variant
您当前的代码满足第一个条件(属性 是 object
类型),但不满足第二个条件。为什么它不能从 属性 类型的对象中推断出存储类型名称 - 我不太确定,也许只是因为 Entity Framework 不是 sql-server 特定的并且支持许多其他数据库,其中object
属性 可以有不同的语义或根本不受支持,因此需要明确说明您的意图。
最近似乎已将支持添加到 .NET Core 2.1 (preview)
中的 Entity Framework 核心,以允许映射 SQL_VARIANT
列 (https://github.com/aspnet/EntityFrameworkCore/issues/7043)。
看起来这样做的方法是使用新的 HasConversion()
方法 (https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions)。
因此,为了映射我的 SQL_VARIANT
列并将基础数据类型视为任意长度的 VARCHAR
(此时我只关心读取它),我可以执行以下(这里的 Value
属性 在模型中属于 object
类型):
entity.Property(e => e.Value).HasConversion(v => v.ToString(),
v => v.ToString());
如果 SQL_VARIANT
的基础数据类型是任意长度的 VARCHAR
,则此方法有效。
但是,作为 SQL_VARIANT
,该列可以包含其他类型的数据,例如 DATETIME
个值。
为简单起见,我在这里只指定了 DateTime
和 string
,但理论上我可能希望支持映射 [=14= 中可以存储的任何内容所必需的数据类型] 列,如果可能的话。
我将如何确定我想在运行时映射到这两种类型(string
和 DateTime
)中的哪一种?有办法吗?
据我了解,目前的方法是:
// where e.Value is property of type "object"
entity.Property(e => e.Value).HasColumnType("sql_variant");
仅此而已,不需要任何自定义转换器。作为添加此功能的 pull 消息指出:
The type mapper will now map properties to sql_variant columns if:
- The property is type object
- The store type name is specified as sql_variant
您当前的代码满足第一个条件(属性 是 object
类型),但不满足第二个条件。为什么它不能从 属性 类型的对象中推断出存储类型名称 - 我不太确定,也许只是因为 Entity Framework 不是 sql-server 特定的并且支持许多其他数据库,其中object
属性 可以有不同的语义或根本不受支持,因此需要明确说明您的意图。