如何在实体框架中使用sql用户定义类型

本文关键字:sql 用户 定义 类型 实体 框架 | 更新日期: 2023-09-27 18:04:51

如何在实体框架中使用由SQL CLR编写的用户定义类型?该类型旨在以正确的方式实现波斯语日期数据类型。我尝试使用HasColumnType()来使用这个自定义类型:

modelBuilder.Properties()
            .Where(x => x.PropertyType == typeof(DateTime))
            .Configure(c => c.HasColumnType("PersianDate"));

但是它没有成功,我得到了这个错误:

系统。InvalidOperationException:序列不包含匹配的元素在System.Linq.Enumerable。单个[TSource](IEnumerable 1 source, Func 2 predicate)在System.Data.Entity.Utilities.DbProviderManifestExtensions。GetStoreTypeFromName(DbProviderManifest, providerManifest,字符串名称)在System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration。配置列(EdmProperty列,EntityType表,DbProviderManifest)在System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration。配置(EdmProperty列,EntityType表,DbProviderManifest, providerManifest, Boolean allowOverride, Boolean fillFromExistingConfiguration)在…

我确信这个错误是使用HasColumnType()的结果。此外,我确信这种类型在我的数据库中正确工作。

如何在实体框架中使用sql用户定义类型

在这一点上,我也同意你在HasColumnType("PersianDate")中声明了错误的值。

基于MSDN, HasColumnType配置数据库列的数据类型,通常使用原始数据类型(更多信息参见这里)。

可能当前的EF 6实现对于用户定义数据类型有一些限制,因为用户定义类型需要在初始化DB时检查类型是否已经创建。

作为用户定义类型的解决方案,在SQL端使用datetime2将波斯语日期声明为列(datetime的最小限制为1753年1月1日,因此不能用于波斯语年),并将其映射为DateTime:

modelBuilder.Properties()
            .Where(x => x.PropertyType == typeof(DateTime))
            .Configure(c => c.HasColumnType("datetime2"));

欢迎提出任何建议。

附加参考:https://stackoverflow.com/a/8143626/6378815