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

时间:2016-08-30 16:42:17

标签: c# asp.net-mvc entity-framework sqlclr

如何在实体框架中使用由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()的结果。此外,我确信这些类型在我的数据库中正常工作。

1 个答案:

答案 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"));

欢迎任何建议。

其他参考:https://stackoverflow.com/a/8143626/6378815