2016-08-30 50 views
1

如何使用一個用戶定義類型 - 通過SQL CLR編寫的 - 在實體框架? 此類型旨在以正確的方式實現波斯日期數據類型。 我試圖用HasColumnType()來使用該自定義類型:如何使用SQL用戶定義類型的實體框架6

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

,但沒有成功,我得到這個錯誤:

System.InvalidOperationException: Sequence contains no matching element at System.Linq.Enumerable.Single[TSource](IEnumerable 1 source, Func 2 predicate) at System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName(DbProviderManifest providerManifest, String name) at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.ConfigureColumn(EdmProperty column, EntityType table, DbProviderManifest providerManifest) at System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration.Configure(EdmProperty column, EntityType table, DbProviderManifest providerManifest, Boolean allowOverride, Boolean fillFromExistingConfiguration) at ...

我敢肯定,這是錯誤的結果使用HasColumnType()。此外,我敢肯定,這種類型在我的數據庫中正常工作。

回答

0

在這一點上,我也同意您已聲明裏面HasColumnType("PersianDate")錯誤值。

基於MSDN,HasColumnType配置數據庫列的數據類型,通常使用基本數據類型(有關更多信息,請參閱here)。

大概是當前實現EF 6的有關於用戶定義的數據類型一定的侷限性,因爲用戶定義類型需要初始化DB當類型尚未創建檢查程序。

作爲用戶定義類型一種變通方法,聲明波斯日期作爲使用datetime2上SQL側(datetime具有1753年1月1最小極限,因此將不波斯年工作),並將其映射爲DateTime柱:

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

歡迎任何建議。

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

+0

也許你是對的,它只是與原始類型的工作。請注意,在搭建任何與DateTime相關的遷移之前,我在數據庫中添加了此自定義類型。另外datetime2有一些限制,我不想使用它,其中之一是可以在數據庫中插入錯誤的日期。 –