最近在.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
值。
为简单起见,我在此处仅指定了DateTime
和string
,但理论上我可能希望支持映射SQL_VARIANT
列中存储的内容所需的数据类型,如果可能的话。
我如何确定在运行时要映射到的这两种类型中的哪一种(string
和DateTime
)?有没有办法做到这一点?
答案 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
属性可以具有不同的语义或根本不受支持,因此需要明确说明您的意图。