現在、エンティティフレームワーク7を使用してAsp.Net 5プロジェクトでデータベースをセットアップしていますが、以前はEF 6を使用していたため、一部の列をnull許容にしたい場合は、次を使用します。
modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();
しかしIsOptional
、もうEF7の一部ではないようです。どうすれば、EF7を使用して同じことを実現できるのでしょうか。
編集:マークの答えは確かに正しいです、最初は私が次のようなものを見つけたのでそれはうまくいきましたがIsOptional
:
builder.Entity<Article>().Property(t => t.ArticleDateModified).IsRequired(false);
しかし、それなしでいくつかのテストを実行した後、ドメインモデルでnull許容としてマークしたため、データベース列をnull許容に設定しました。
public DateTime? ArticleDateModified { get; set; }
また、DateTime
null許容値を作成してを使用するIsRequired(false)
と、次のエラーが発生したことにも注意してください。
エンティティタイプ「Article」のプロパティ「ArticleDateModified」は、プロパティのタイプがnull許容型ではない「DateTime」であるため、null許容/オプションとしてマークできません。すべてのプロパティをnull許容/必須としてマークできますが、null許容タイプのプロパティで、主キーの一部ではないプロパティのみをnull可能/オプションとしてマークできます。
したがって、IsRequired(false)
データベース列をnull許容にするために必要なのは、ドメインクラスでnull可能にすることだけである場合、ここで何を使用するのでしょうか。
このドキュメントページの注記に基づくと、これを宣言的に行うためのサポートは取り消されたようです。ウィットに:
CLRタイプにnullを含めることができないプロパティは、オプションとして構成できません。プロパティは常にEntityFrameworkによって必要と見なされます。
これは意図的には、GitHubの上でホスティング事業からの設計の議論で見ることができたことを、具体的:
つまり、null許容としてマークされたプロパティはnull値をサポートしますが、null不可能としてマークされたプロパティにはnull値を含めることはできません。このことから、null許容でないCLRタイプのプロパティをnullを許可するものとしてマークすることは許可されません。これは、これが許可されているEF6の動作とは異なります。[強調を追加]
結果として、EF7では、NULL
列はnull許容のマップされたプロパティを厳密に意味します。プロパティがnull許容の場合、。でNULL
マークまたは構成しない限り、関連する列はnull可能である必要がありますIsRequired
。
OP編集への応答
それは興味深いことIsRequired(bool)
です。最初はAPIに関するドキュメントを見ていませんでした。6月の会議ノートで、これはEF6と同等であると述べている議論のポイントを見つけましたIsOptional()
。
.IsOptional()-Required(false)を呼び出すことでこの機能を提供します
。.IsRequired()-同じ機能でRequired()を提供します
これが当初の意図であったとしても、サポートを取り消すという設計上の決定は10月から始まります。(更新ごとに)IsRequired(false)
null許容でないプロパティを設定しようとすると、完全に削除されるのではなく、実行時エラーが発生します。
今余分ものの、APIは、有効なコードを壊すことなく取り外すことができません:それは別々に実装されていなかったIsRequired(bool)
とIsRequired()
の定義が、単一でIsRequired(bool required = true)
。それが削除され、パラメータのないバージョンに置き換えられた場合、それは重大な変更になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加