如何正确处理实体框架核心中的SQL_VARIANT?



看起来最近在.NET Core 2.1 (preview)中向实体框架核心添加了支持,以允许映射SQL_VARIANT列(https://github.com/aspnet/EntityFrameworkCore/issues/7043)。

看起来执行此操作的方法是使用新的HasConversion()方法(https://learn.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值。

为简单起见,我在这里只指定了DateTimestring,但理论上,如果可能的话,我可能希望支持映射可以存储在SQL_VARIANT列中的任何内容所需的数据类型。

我将如何确定要在运行时映射到这两种类型(stringDateTime)中的哪一种? 有没有办法做到这一点?

据我了解,目前要走的路只是:

// where e.Value is property of type "object"
entity.Property(e => e.Value).HasColumnType("sql_variant");

仅此而已,不需要任何自定义转换器。正如添加此功能的拉消息所述:

在以下情况下,类型映射器现在会将属性映射到sql_variant列:

  • 属性是类型对象
  • 存储类型名称指定为 sql_variant

当前代码满足第一个条件(属性类型为object),但不满足第二个条件。为什么它不能从类型对象的属性推断存储类型名称 - 我不太确定,也许只是因为实体框架不是特定于 sql 服务器的,并且支持许多其他数据库,其中object属性可以具有不同的语义或根本不支持,因此它需要明确说明您的意图。

最新更新