Fluent APIを使用してEF6コードの最初のモデルを構築しています。私の理解では、デフォルトでは、文字列はnvarchar(max)
です。したがって、次の規則コードを追加して、デフォルトの最大長を255文字に設定しました。
_modelBuilder.Properties<string>()
.Configure(p => p.HasMaxLength(255));
_
次に、次のようなデコレータを作成しました。
_[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TextAttribute : Attribute
{
}
_
これを、実際にNVARCHAR(MAX)
にしたい特定の文字列プロパティに適用します。
_[Text]
_デコレーターを持つすべての文字列プロパティがNVARCHAR(MAX)
を使用してデータベースに構築されるようにするには、Fluent APIに何を入れますか?私はそれがこのようなものになると思います:
_modelBuilder.Properties<string>()
.Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
.Configure(p => p.HasMaxLength(?????));
_
それとも私はこれを完全に間違っていますか?
今までに答えが見つかったかどうかはわかりませんが、他の誰かがそれを行う方法を疑問に思っている場合は、SQLデータ型を設定してHasMaxLength()の呼び出しを無視してください。
modelBuilder.Properties<string>()
.Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
.Configure(p => p.HasColumnType("nvarchar(max)"));
IsMaxLength()またはHasMaxLength(null)を使用すると、フィールドがnvarchar(4000)(データ型をvarcharとして指定した場合はvarchar(8000))に設定されます。
EntityTypeConfiguration<MyEntity>
クラス内で行う場合、@ RickNoの回答に似ていますが、次のように行われます。
Property(x => x.MyVarcharMaxProperty)
.HasColumnType("nvarchar(max)");
データベースで許可されている最大値を使用することを示す方法があります。
IsMaxLength()
modelBuilder.Properties<string>()
.Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
.Configure(p => p.HasColumnType("nvarchar").IsMaxLength());