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

时间:2018-04-06 23:15:08

标签: c# .net-core entity-framework-core sql-variant

最近在.NET Core 2.1 (preview)中向Entity Framework Core添加了支持,以允许映射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值。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

这就是全部,不需要任何自定义转换器。添加此功能的pull消息指出:

  

类型映射器现在将属性映射到sql_variant列,如果:

     
      
  • 属性是类型对象
  •   
  • 商店类型名称指定为sql_variant
  •   

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