2016-04-14 5 views
-1

だから、この問題は、SOの多くの異なる答えを持っているようです - しかし、私の問題を解決する重複を見つけることができないか、問題が何であるかを明らかにします。この問題は、挿入/作成しようとするとdb.SaveChanges()で検証エラーが発生したときに発生します。まず第一に、デバッガの検証の下で "モデルにIDが必要です"というメッセージが表示されました。もちろん、まず第一に、私のIDは、これを読んだ後でわからない文字列でした。 How to generate and auto increment Id with Entity Framework 私はIDをintに変更し、上記のリンクソリューションに従って[Key]データアノテーションを削除しました。私もDBを更新しました。しかし、IDは0と表示され、 "NULLを値に挿入することはできません"というエラーが表示されます。ただし、IDをハードコードするとテーブルが正常に更新されます。ここではコードです..任意のヘルプが感謝します。 モデル:createメソッドのモデルのIDが常にnullで無効なのはなぜですか?

public class Model 
{ 
    //[Key] 
    //[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ModelId { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public string Description { get; set; } 

    [Required] 
    [DataType(DataType.Time)] 
    public DateTime OpenTime { get; set; } 

    [Required] 
    [DataType(DataType.Time)] 
    public DateTime CloseTime { get; set; } 

    //Navigation property 
    public virtual ICollection<OtherModel> OtherModels { get; set; } 
} 

コントローラ:

// GET: Model/Create 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    // POST: Model/Create 
    [HttpPost] 
    public ActionResult Create(Model model) 
    { 
     try 
     { 
      db.Models.Add(model); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(model); 
     } 
    } 
+0

コメントアウトした属性が必要です。 –

+0

SQL Serverを使用していますか? – Henrique

+0

はい、SQL Server – Inkers

答えて

1

あなただけのエンティティフレームワークが自動あなたのためのIDをインクリメントすることDatabaseGenerated(DatabaseGeneratedOption.Identity)] .Afterが含まれている行のコメントを解除する必要があります。または、IDをカスタマイズしてエンティティフレームワークが生成するのを望まない場合は、DatabaseGenerated(DatabaseGeneratedOption.Identity)]DatabaseGenerated(DatabaseGeneratedOption.None)]に置き換えることができます。

+0

Efはキー値を生成/増分しません。注釈は、EFにデータベースがそれを行うことを知らせるためだけに役立ちます。しかし、私はこれがここでは起こらないと思います。 –

+0

したがって、ソリューションを再構築してこれを試しましたが、引き続きNULL例外が発生しました。最初にデータベースを更新する必要がありますか?それは、列がNULLを許可しないと言うが、私はそれをintにするとは思わない? idは解決策ですか? – Inkers

+1

アプリケーションでコードを最初に使用していますか?次に、移行によってデータベースを更新しようとします。アプリケーションでの移行を有効にするには、パッケージマネージャーのコンソールでenable-migrationsを実行するだけです。 –

0

SQL Serverを使用する場合、ModelIdはデータベースのIDである必要があります。

すべてのエンティティには少なくとも1つのキーが必要です。

+0

ここで間違っているかもしれませんが、コードを初めて実行するときにEntity Frameworkがキー作成を処理すると思います。それはIDを持つプロパティを探し、キーとして設定します...私は..おそらく他の誰かが確かに知っていると思います。 – Inkers

1

ModelIdプロパティを次のように更新し、Package Manager Consoleを使用して移行を適用します。

問題はまだ解決されていない場合
[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int ModelId { get; set; } 

SSMS(SQL Server Management Studioを)使用してデザインモードで、関連するテーブルを開きます。次に、ModelIdPKと思われ、Is Identityプロパティが「Yes」に設定されていることを確認します(下のスクリーンショット参照)。部品に有用な他の人のために少し誤解を招くかもしれないが、私は、とてもこれで多くのコメントを間違った方向に行っていた

IsIdentity

+0

OK、それは一度働いた!私は変える必要があると思う。元気? PK違反エラーを取得する - 重複を挿入できません – Inkers

+0

これは、互換性のないPK値と関連テーブルのFK値が原因で発生している可能性があります。関連する表に互換性のない値のペアがあるかどうかを確認してください。 –

+0

OK。だから私は接続されたテーブルの外来キーをチェックし、それを以前に変更したときにintに変更するのを忘れていることを発見しました。問題はあるものの、依然として重複エラーが発生すると考えました。 – Inkers

-1

...この情報がお役に立てば幸いです。 問題:ゲルト・アーノルドとRAMNシンは、私が身元ずに最初の場所で私のテーブルを作成し、示唆したように:真

[DatabaseGenerated(DatabaseGeneratedOption.Identityは)] //あなたのモデルにこれを含める必要があることを意味しています

テーブルを作成した後にを含めると何も実行していませんでした。データベースを更新してdbを削除して再作成しても、idをnullエラーにすることはできません。 そしてその後、私はこれに出くわした:

  1. Reset Entity-Framework Migrationsは、ソリューションエクスプローラ、マイグレーションに移動し、右クリックし、削除します。
  2. SQL Serverオブジェクトエクスプローラの移行履歴で、削除を右クリックし、スクリプトの生成と実行を待ちます。
  3. オープンパッケージマネージャコンソール([ツール] - NuGetパッケージマネージャ - パッケージマネージャコンソール)
  4. タイプ有効-移行-Force
  5. を追加し、移行初期
  6. アップデート - データベース

何人かの人々のために、この"table x already exists"例外がスローされます。上のリンクでは、移行の「上」の部分についてコメントしています。私が試したとき、私のプロジェクトは構築されませんでした。 私のデータが重要でない/テストだったので、私は

  1. に戻ったSQL Serverは、オブジェクトエクスプローラすべてのテーブル(ないシステム)を選択し、右クリックし、削除します。
  2. PMコンソールに戻り
  3. アップデートデータベース

プロジェクトを実行し、DBとの対話。これが他人を助けることを望みます。

関連する問題