web-dev-qa-db-ja.com

EF6コードの最初の文字列を流暢にnvarchar(max)に設定します

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(?????));
_

それとも私はこれを完全に間違っていますか?

14
Jeremy Holovacs

今までに答えが見つかったかどうかはわかりませんが、他の誰かがそれを行う方法を疑問に思っている場合は、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))に設定されます。

20
RickNo

EntityTypeConfiguration<MyEntity>クラス内で行う場合、@ RickNoの回答に似ていますが、次のように行われます。

Property(x => x.MyVarcharMaxProperty)
    .HasColumnType("nvarchar(max)");
11
Charlie Kilian

データベースで許可されている最大値を使用することを示す方法があります。

IsMaxLength()

    modelBuilder.Properties<string>()
        .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
        .Configure(p => p.HasColumnType("nvarchar").IsMaxLength());
4
Dionny Prensa

HasColumnTypeを使用できます

enter image description here

または、HasColumnTypeまたはHasMaxLengthなしで使用できます。 HasMaxLengthを使用する必要はありません

enter image description here

2
Ergin Çelik