您如何在Entity Framework Core中正确处理SQL_VARIANT?

Int*_*ble 7 c# sql-variant entity-framework-core .net-core

似乎最近已在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());
Run Code Online (Sandbox Code Playgroud)

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

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

为简单起见,我只规定DateTimestring这里,但在理论上我可能要支持任何可以被存储在一个必要的映射数据类型SQL_VARIANT,如果可能的列。

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

Evk*_*Evk 7

据我了解,目前的方法是:

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

仅此而已,不需要任何自定义转换器。作为请求消息添加此功能说明:

现在,如果满足以下条件,类型映射器将把属性映射到sql_variant列:

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

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