11

看起来最近已向 Entity Framework Core 添加了支持,.NET Core 2.1 (preview)以允许SQL_VARIANT列映射 ( https://github.com/aspnet/EntityFrameworkCore/issues/7043 )。

看起来这样做的方法是使用新HasConversion()方法(https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions)。

因此,为了映射我的SQL_VARIANT列并将基础数据类型视为VARCHAR任意长度的 a(此时我只关心读取它),我可以执行以下操作(此处的Value属性是object模型中的类型):

entity.Property(e => e.Value).HasConversion(v => v.ToString(),
                                                            v => v.ToString());

如果SQL_VARIANT的基础数据类型是VARCHAR任意长度的,则此方法有效。

但是,作为 a SQL_VARIANT,该列可以包含其他类型的数据,例如DATETIME值。

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

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

4

1 回答 1

11

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

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

仅此而已,无需任何自定义转换器。作为添加此功能的拉取消息状态:

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

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

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

于 2018-04-09T09:20:55.043 回答