c# - 您如何正确处理 Entity Framework Core 中的 SQL_VARIANT?

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

看起来最近在 .NET Core 2.1(预览版) 中添加了对 Entity Framework Core 的支持,以允许映射 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");

仅此而已,不需要任何自定义转换器。作为pull添加此功能的消息指出:

The type mapper will now map properties to sql_variant columns if:

  • The property is type object
  • The store type name is specified as sql_variant

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

关于c# - 您如何正确处理 Entity Framework Core 中的 SQL_VARIANT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702144/

相关文章:

entity-framework - 在.NET Core 5上运行的ORM

azure - .NET Core 中的 Kustos 连接字符串问题

c# - 在 OnModelCreating 期间设置列名称

c# - EF Core FromSql 的可选参数

c# - 2 在 c# 中启用可编辑 DataGridViewComboBox(非数据绑定(bind))的问题

c# - Windows UIAutomation 获取文件类型

c# - 多线程时的意外结果

c# - 将 Google map 包含在 .Net Core 中的正确方法?

c# - .net 核心 2.2 EF : SaveChangesAsync() setting unrelated columns to null

c# - 构建后找不到已安装包的命名空间