47

Entity Frameworkのコードファースト機能を使用していますが、列データ型を指定する方法を理解しようとしていますデータベースが自動生成されたときに作成される必要があります。プロパティでnvarchar(4000)ではなくTEXT列を生成するように指定する方法

私は単純なモデルがあります:私は自分のアプリケーションを実行すると

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 Schema

、とても良いです!しかし、BodyBodyHtmlのプロパティに挿入するデータは、NVarCharの列タイプの最大許容長よりも大きくなります。したがって、これらのプロパティに対しては、EFでTextカラムを生成します。

しかし、私はこれを行う方法を見つけることができないようです!グーグルと読み出しのかなり後、私は、this answerに見出される情報から、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. 

しかし、私は、私が指定されなければならない、と私は私に言うだろう何かを見つけることができませんでしたどのような名前空間またはエイリアス見当がつかない。

私もthis referenceごとに注釈を変更してみました:

using System.Data.Linq.Mapping; 

... 

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

をこの場合、データベースが作成ですが、Body列はまだNVarChar(4000)あるので、注釈が無視されるようです。

誰でも手助けできますか?これはかなり一般的な要件であるはずですが、私の検索は無駄でした!

+3

CEはテキストをサポートしていますか?データ型リストを見ると、ntextは見ることができますが、テキストは見ることができません。 –

+0

@Damien、ありがとうございます - これを回答として追加してください(データタイプリストへのリンクを追加してください)、私はそれを受け入れます。 –

+0

データ型のオンラインリストが見つかりませんでした。確認するためにCE BOLをダウンロードしなければなりませんでした。 Kristof Claesが同じ地面をカバーする答えを加えたようです。 –

答えて

66

ので、私はこれをテストし、その

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

を見つけた...私は、既存の答えに入った努力に感謝し、私はそれが実際に質問に答える発見していません(System.ComponentModel.DataAnnotationsの1つ)は、ntext型の列を作成するために動作します。

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

+3

データベースがntextに設定されていても、4000文字を超える文字を挿入しようとすると、モデルの検証によっても問題が発生し、エラーが発生しますが、 "文字列"型を読み取ったときに自動的に最大長= 4000、 。まだ解決していない私のために。 – Nestor

1

小文字を試しましたか?"text"this MSDN discussionとすると、データプロバイダは大文字と小文字を区別します。

+0

私はそれを試みましたが、それは何の違いもありません:生成された列はまだ 'varchar'です。私は試してみることができるいくつかの他の方法があるように思えます。私は読んだりします。 –

9

ntextを試しましたか?私はSQL CE 4.0データベースを作成しました。テーブルに列を手動で追加すると、ntextの間にtextがデータ型のリストで使用できないことがわかりました。 nvarcharを選択できますが、varcharは指定できません。

残念ながら、nvarcharのサイズは最大4000です。だからnvarchar(max)もオプションではありません。

There is ntext but no text

+0

しかし、モデルをどのように定義すれば、モデル検証はntextであり、文字列ではありません(デフォルトでmax = 4,000)。私はdbにntextを設定しましたが、4000個以上の文字を追加するとエラーが発生します。私のモデルプロパティは文字列型です。 – Nestor

+0

文字列プロパティに '[Column(TypeName =" ntext ")]'を入れてみましたか? –

+0

はい、十分ではありませんでしたが、[MaxLength]を追加すると、デフォルトの文字列タイプの最大長ではなく、データベース内のチェックフィールドのサイズが強制的に変更されました。 – Nestor

1

このDataAnnotationは、コード・ファーストを行います... SQL

[StringLength(1073741822)] 

ていない他の大きな数字が同じことを行う場合は必ずではnvarchar(MAX)列を生成し、私は電卓とデータ型はnvarchar(MAX)スペックを使用して、この1つを得ました。

私は、SQL Server 2005 Expressまたはないでそれを試してみたが、CEと

私はそれを使用していないと、それは動作しますが、私はそれは良いアイデアだかどうかを知りたいのか、私はあれば何かが欠落しています...私はnvarchar(MAX)が必要であることをコードで最初に知る方法はありますか?

1

このDataAnnotationは、例えば、文字列の長さ属性を使用して問題のコード・ファーストは:)も

[StringLength(4010)] 
5

をSQLのデータ型はnvarchar(MAX)列を生成するようになります

[StringLength(4010)] 

任意の文字列>属性で定義された文字の数は一種のあなたが列を非定義されたフィールドサイズを使用する理由何らかの理由に反する、または使用検証例外をトリガすることです属性に膨大な数があり、属性によって提供されるすべての検証が失われます。最終的には、StringLength属性を使用する場合、マッピングの問題を解決するための検証メカニズムを使用しています。ここで、Marcel PopescuのColumn属性を使用した回答は、マッピング属性を使用してタイプを定義しているので、検証のためのStringLength属性

もう1つの方法は、EF4 CTP5流暢APIを使用して、DbContextのOnModelCreatingイベントで列マッピングを定義することです。

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

またNTEXTあなたは、次のDataAnnotationとコード・ファースト意志を使用することができ、非推奨のデータ型(ntext, text, and image (Transact-SQL) MS Books Online)であるとの勧告がその場所にNVARCHAR(MAX)を使用することです

+1

MS SQL CEは非推奨ではありません。ここでは、MS SQL CE(4)のケースについて言及しています。 – Nestor

+2

本当に、Sql CE 4.0 Docs(http://msdn.microsoft.com/en-us/library/ms172424%28v=SQL.110%29.aspx)をチェックしましたが、ntext型は任意の(SQLサーバー)の文字列関数を使用し、テーブルの残りのデータページにデータを格納するため、パフォーマンス上の理由でnvarchar(max)を使用しないようにする明確な理由がない限り、個人的には – nakchak

28

ことに留意すべきですデータベースが許容する最大サイズのデータ​​型を生成します。 Sql CEの場合、結果としてntextカラムが生成されます。

[MaxLength] 

またはEF 4.1 RC流暢なAPIを使用して、私も追加する必要がありますが...

protected override void OnModelCreating(ModelBuilder modelBuilder){ 
    modelBuilder.Entity<Article>() 
     .Property(p => p.Body) 
     .IsMaxLength(); 
} 
+0

それでもSQL Server CE + EFのコードでこれと苦労しています。これは、typeName = ntextを試しても、 "フィールドが最大長の文字列または配列型でなければなりません。 4000 '」のデータ長> 4000 ... [MaxLength]は、ntextにして完全なデータ長を使用できるようにするために列で必要なものです。 – Rich

1

は、TypeName = "ntext"が動作するように思われることに同意:

[StringLength(Int32.MaxValue)] 

デフォルトを停止します途中で128文字列の長さになります。

用途:

+1

これはSQL CEでは機能しません。代わりに、[MaxLength]を使う際のMichaelの答えを見てください。 – LordHits

4

私が知っている、これはおそらく遅すぎるが、今年で

[StringLength(-1)] 

これは、ntext型のフィールドを作成します。コンパクトエディション4.0データベース を使用して、そのフィールドに少なくとも25キロバイトを格納することができました。

0

あなたはパッケージマネージャを使用して、更新・データベースの移行を追加する場合は、あなたが追加することによって作成し、テーブルを修正することができますstoreTypeは次のとおりです。

 CreateTable(
      "dbo.Table_Name", 
      c => new 
       { 
        ID = c.Int(nullable: false, identity: true), 
        Title = c.String(nullable: false, maxLength: 500), 
        Body = c.String(unicode: false, storeType: "ntext"), 
       }) 
      .PrimaryKey(t => t.ID); 
1

あなたはすべてのあなたの特性に注釈を付けたくない、あなたは現代的なEFを使用して、規則を使用している場合:

public class StringNTextConvention : Convention { 
    public StringNTextConvention() { 
    Properties<string>().Configure(p => p.HasColumnType("ntext"));      
    } 
} 

あなたのonModelCreating()からそれを呼び出すことができます。

​​

とすべてのあなたのstring秒自動的にntext列になります。