2016-08-30 5 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は、通常プリミティブデータ型を使用してデータベース列のデータ型を構成します(詳細はを参照)。

EF6の現在の実装では、ユーザー定義型では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

+0

は、おそらくあなたは正しい、それだけでプリミティブ型での作業です。 DateTime関連の移行を足場に乗せる前に、このカスタムタイプをデータベースに追加しました。また、datetime2にはいくつかの制限があり、私はそれを使用したくない、そのうちの1つはデータベースに間違った日付を挿入することができるということです。 –

関連する問題