51

私は Entity Framework の Code First 機能を使用しており、データベースの自動生成時に作成する必要がある列のデータ型を指定する方法を見つけようとしています。

私は単純なモデルを持っています:

public class Article
{
    public int ArticleID { get; set; }

    public string Title { get; set; }
    public string Author { get; set; }
    public string Summary { get; set; }
    public string SummaryHtml { get; set; }
    public string Body { get; set; }
    public string BodyHtml { get; set; }
    public string Slug { get; set; }

    public DateTime Published { get; set; }
    public DateTime Updated { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

アプリケーションを実行すると、SQL CE 4.0 データベースが次のスキーマで自動的に作成されます。

DB スキーマ

ここまでは順調ですね!Bodyただし、プロパティに挿入するデータは、BodyHtml通常、列の型で許可されている最大長よりも大きいため、NVarCharEFTextでこれらのプロパティの列を生成する必要があります。

しかし、私はこれを行う方法を見つけることができないようです! かなりのグーグルと読書の後、この回答DataAnnotationsにある情報から、を使用して列タイプを指定しようとしました:

using System.ComponentModel.DataAnnotations;

...

[Column(TypeName = "Text")]
public string Body { get; set; }

これにより、次の例外がスローされます (データベースが削除され、アプリが再実行された場合)。

Schema specified is not valid. Errors: (12,6) : error 0040: The Type text is not qualified with a namespace or alias. Only PrimitiveTypes can be used without qualification.

しかし、どの名前空間またはエイリアスを指定する必要があるのか​​ わかりません。また、それを教えてくれるものも見つかりませんでした。

私はまた、この参照に従って注釈を変更しようとしました:

using System.Data.Linq.Mapping;

...

[Column(DbType = "Text")]
public string Body { get; set; }

この場合、データベース作成されますが、Body列はまだNVarChar(4000)であるため、アノテーションは無視されているようです。

誰でも助けることができますか?これはかなり一般的な要件のように思えますが、私の検索は無駄でした!

4

12 に答える 12

77

既存の回答に費やされた努力に感謝しますが、実際に質問に回答していることがわかりませんでした...これをテストしたところ、

[Column(TypeName = "ntext")]
public string Body { get; set; }

(からのものSystem.ComponentModel.DataAnnotations)は、ntextタイプの列を作成するために機能します。

(受け入れられた回答に関する私の問題は、インターフェイスで列のタイプを変更する必要があることを示しているように見えることですが、問題はプログラムでそれを行う方法です。)

于 2011-02-06T13:38:24.270 に答える
32

次の DataAnnotation を使用できます。Code-First は、データベースが許可する最大サイズのデータ​​型を生成します。Sql CE の場合、基になる ntext 列になります。

[MaxLength]

またはEF 4.1 RC流暢なAPIを使用して...

protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Article>()
        .Property(p => p.Body)
        .IsMaxLength();
}
于 2011-03-21T10:53:28.413 に答える
9

試しましたntextか?textSQL CE 4.0 データベースを作成したばかりですが、列をテーブルに手動で追加すると、データ型のリストで使用できないことに気付きましたntext。あなたが選ぶことができるのと同じように、そうではnvarcharありませんvarchar

nvarchar残念ながら、選択できる最大サイズは 4000 です。これnvarchar(max)もオプションではありません。

ntext はあるがテキストがない

于 2011-02-04T08:13:36.550 に答える
6

文字列の長さ属性の使用に関する問題

[StringLength(4010)]

任意の文字列 > 属性で定義された文字数が検証例外をトリガーします。これは、列で定義されていないフィールド サイズを使用する理由や、属性で巨大な数を使用して失う理由に反するものです。属性によって提供される検証。StringLength 属性を使用する場合、最終的には検証メカニズムを使用してマッピングの問題を解決しています。ここで、列属性を使用するマルセル・ポペスクの答えは、マッピング属性を使用して型を定義しているため、はるかに優れたソリューションであり、引き続き使用できます検証用の StringLength 属性。

別のオプションは、EF4 CTP5 fluent API を使用し、DbContext の OnModelCreating イベントで列マッピングを定義することです。

protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Article>()
    .Property(p => p.Body)
    .HasColumnType("nvarchar(max)");
}

また、NText は非推奨のデータ型 ( ntext, text, and image (Transact-SQL) MS Books Online ) であり、代わりに NVarChar(MAX) を使用することをお勧めします。

于 2011-02-23T18:32:26.537 に答える
5

使用できますSystem.ComponentModel.DataAnnotations.Schema.ColumnAttribute

[Column(TypeName="text")]
public string Text { get; set; }

または Fluent API 経由:

modelBuilder.Entity<YourEntityTypeHere>()
    .Property( e => e.Text)
    .HasColumnType("text");
于 2014-10-09T04:56:28.817 に答える
5

私は知っています、これはおそらく1年遅すぎますが、

使用する:

[StringLength(-1)] 

これにより、nText フィールドが作成されます。Compact Edition 4.0 データベースを使用して、そのフィールドに少なくとも 25K バイトを格納することができました。

于 2012-02-08T16:13:12.927 に答える
1

この DataAnnotation により、Code-First は SQL で nvarchar(MAX) 列を生成します

[StringLength(1073741822)]

他の大きな数字が同じかどうかはわかりません...電卓と nvarchar(MAX) 仕様を使用してこれを取得しました。

SQL Server 2005 Express で試してみましたが、CE では試しませんでした

私はそれを使用していて動作しますが、それが良い考えなのか、それとも何か不足しているのか知りたいのですが... nvarchar(MAX)が必要であることをコードファーストに知らせる方法は他にありますか?

于 2011-02-16T15:38:00.933 に答える
1

小文字を試しました"text"か?このMSDNの議論によると、データ プロバイダーは大文字と小文字を区別します。

于 2011-02-04T07:18:22.317 に答える
1

この DataAnnotation は、Code-First が SQL で nvarchar(MAX) 列も生成するようにします:)

[StringLength(4010)]
于 2011-02-17T14:03:58.707 に答える
1

TypeName = "ntext"私も追加する必要がありますが、それはうまくいくように見えることに同意します:

[StringLength(Int32.MaxValue)]

デフォルトの文字列長 128 が邪魔にならないようにします。

于 2011-03-28T19:07:49.507 に答える