如何在实体框架中使用由SQL CLR编写的用户定义类型? 此类型旨在以正确的方式实现波斯日期数据类型。 我尝试使用HasColumnType()来使用此自定义类型:
modelBuilder.Properties()
.Where(x => x.PropertyType == typeof(DateTime))
.Configure(c => c.HasColumnType("PersianDate"));
但是没有成功,我收到了这个错误:
System.InvalidOperationException:Sequence不包含匹配元素 在System.Linq.Enumerable.Single [TSource](IEnumerable
1 source, Func
2谓词) at System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName(DbProviderManifest providerManifest,String name) 在System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.ConfigureColumn(EdmProperty列,EntityType表,DbProviderManifest providerManifest) 在System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(EdmProperty column,EntityType table,DbProviderManifest providerManifest,Boolean allowOverride,Boolean fillFromExistingConfiguration) 在 ...
我确定这个错误是使用HasColumnType()的结果。此外,我确信这些类型在我的数据库中正常工作。
答案 0 :(得分:1)
此时,我也同意您在HasColumnType("PersianDate")
内声明了错误的值。
基于MSDN,HasColumnType
配置数据库列的数据类型,通常使用原始数据类型(有关详细信息,请参阅here)。
可能目前EF 6的实现对用户定义的数据类型有一些限制,因为用户定义的类型需要在初始化DB时检查尚未创建类型的例程。
作为用户定义类型的变通方法,在SQL端使用datetime2
将波斯日期声明为列(datetime
的最小限制为1753年1月1日,因此对波斯年不起作用)并将其映射为DateTime
:
modelBuilder.Properties()
.Where(x => x.PropertyType == typeof(DateTime))
.Configure(c => c.HasColumnType("datetime2"));
欢迎任何建议。