Entity Framework 4.0(モデルが最初)を使用してプロジェクトを作成しています。プロジェクトの最初に、私はこの問題に直面しました:埋められたオブジェクトをデータベースに挿入しようとしていますが、例外があります:
列「CategoryId」、テーブル「ForumDB.dbo.Categories」に値NULLを挿入できません。列はnullを許可しません。 INSERTは失敗します。ステートメントは終了されました。
コード:
Category usingCategory = new Category("Using Forums", "usingforums", 0);
using (Context)
{
Context.Categories.AddObject(usingCategory);
Context.SaveChanges();
}
私はこのオブジェクトをチェックしましたが、確実に満たされています。
念のため:
public Category(string name, string urlName, int index)
{
CategoryId = Guid.NewGuid();
Name = name;
UrlName = urlName;
CategoryIndex = index;
}
何が起こっている?
これを見てください: https://stackoverflow.com/a/5338384/1717 -エンティティフレームワークは、CategoryIdフィールドがIDであると想定しているため、データベースにnullを渡して、データが入力されることを期待しています。あなたのために。
今日これに遭遇し、データベースからEFクラスを再生成する必要がありました。
それを行った後、EFが追加したことがわかりました。
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
sQLのIdentity列であったこの「Id」フィールドに、アプリケーションが割り当てられるように変更されました。
その属性がない場合、EFは実際にIDをデータベースに送信しません( 'convention over configuration')
PKとしてint Idを使用してテーブルを作成しましたが、「ID仕様」= Trueに設定するのを忘れていました
これをモデルクラスの.csファイルに追加してみてください。
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CategoryId { get; set; }
または、列のCategoryIdをidentityに変更します。
CategoryId int IDENTITY(1,1)
Modelfモデルの最初の試行ブロック
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int64 PolicyID { get; set; }
今日も同じ問題に遭遇しました。
これが私が問題を理解した方法です。
最初にアイデンティティシードを列に追加しましたが、その後それを削除しました。そのため、コードの列定義を最初に変更すると、Id
Property(x => x.Id).HasColumnName(@ "Id")。HasColumnType( "int")。IsRequired();
したがって、EntityフレームワークはそれがIdentity列であることがわかり、上記の例外が発生しました。
これを修正するために、「HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)を追加したので、最後の部分は次のようになりました。
Property(x => x.Id).HasColumnName(@ "Id")。HasColumnType( "int")。IsRequired()。HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); =
私にとっては、デフォルト以外のスキーマがありました。 Idキーの名前は、そのスキーマ部分がいくらか欠けているものでした-データベース内で修正され、すべてうまくいきました。いかがでした;
PK_TableName
変更方法
PK_mySchema.TableName