私はEF CTP 4を使用しています。EFを使用してSQLデータベースにデータを挿入するシンプルなコンソールアプリ(テスト用)があります。
アイテムを挿入すると問題が発生しました
using(var context = GetContext())
{
BOB b = new BOB();
b.Id = 1;
context.Bobs.Add(b);
context.SaveChanges();
}
エラーをスローします:{"列 'Id'に値NULLを挿入できません。テーブル 'TestDB.dbo.BOB'。列はNULLを許可しません。INSERTは失敗します。\ r\nTheステートメント終了しました。 "}
テーブルには、1つのフィールドId int NOT NULLがあります。これは、プライマリキーであり、not自動増分IDです。
DataContextの作成時に、この構成があります。この構成は起動されます。
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<BOB>().HasKey(b => b.Id);
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}
また、このテーブルを事前に設定し、デバッガーを介してwatchを介してこのBOBオブジェクトをロードできるようにしたため、本当に困惑しています。私のBOBをロードできるということは、すべてが正しいことを示しています...しかし、新しいものを挿入するとクラッシュします...
StoreGeneratedPattern
を明示的に指定しようとしましたか?
modelBuilder.Entity<BOB>()
.HasKey(p => p.Id)
.Property(p => p.Id)
.StoreGeneratedPattern = StoreGeneratedPattern.None;
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
私はここで同じ問題を抱えており、それは本当にい解決策です。
[Key]
public Int64 PolicyID { get; set; }
これは自動生成された番号ではありません
その後、同じエラーが発生しました。
EFコードファーストCTP5
これを適用した後:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int64 PolicyID { get; set; }
その後、動作します。
私はEF 4.1、Model Firstを使用していますが、この問題に遭遇しました。ここに私がそれを解決した方法があります:
モデルデザイナサーフェスを使用する場合、エンティティを作成するときに、「キー」プロパティを定義する必要があります。デフォルトはId、int32です。
私の状況では、IdにGuidsを使用することを選択したため、int32をGuidに切り替えます。しかし、エンティティを作成した後にこのIDを調べると、IDの「StoreGeneratedPattern」で「ID」が選択されていることがわかりました。最初はそれが問題だとは思いませんでしたが、データベースへの挿入に使用されているSQLを調べたときに、IDを送信していないという点で少し奇妙でした。 フラストレーション!
しかし、戻って「StoreGeneratedPattern」を「identity」から「none」に変更し、dbを再生成してプロジェクトを再構築すると、この奇妙な{"列NULLに値NULLを挿入できません'、table' TestDB.dbo.BOB ';列はnullを許可しません。INSERTが失敗しました。\ r\nステートメントは終了しました。 "}が停止しました。
参考までに、SQLをさらに表示すると、「StoreGeneratedPattern」に「identity」が選択されている場合、EFはオブジェクトをdb(sans Id)に保存し、すぐにIDをフェッチしてオブジェクトに保存します。つまり、この 'StoreGeneratedPattern'の選択は、IDを生成するためにdbに依存しています[〜#〜] not [〜#〜] your code!
Dbのスキーマ内の尊重された列(ID列)に主キーが欠落しているときに、それが起こりました。 SSMSエクスポートツールを使用して新しいデータベースを作成し、SQLサーバー間でデータをエクスポートしましたが、キーなしでデータのみをエクスポートしていることに気付きませんでした。
あなたも使うことができます
modelBuilder.Entity<BOB>()
.HasKey(p => p.Id)
.Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
同様の状況がありましたが、私の場合はIdentity
をoff
に設定しても解決しませんでした。
この問題は、エンティティモデルに追加することができなかったプライマリキーに関連していました。
モデルを生成していたスクリプトは次のとおりです。
CREATE TABLE [im].[SomeGroup]
(
[Id] INT NOT NULL IDENTITY(1,1), -- this is mandatory for EF
[OtherGroupId] INT NOT NULL,
[Title] NVARCHAR(512) NOT NULL
)
上記のC#コードは次のとおりです。
Insert(new SomeGroup
{
// I'm not providing Id here, cause it will be auto-generated
SomeGroupId = otherGroup.Id,
Title = otherGroup.Title
});
ここ もその説明です。
この質問は何らかの形で日付が付けられており、受け入れられた解決策が既に見つかっていることは知っていますが、自分の発見を共有することが役立つと思いました。
同じDataContext
の2つの異なるインスタンスを使用していたため、今日このエラーが発生しました。私はいくつかのプロパティを持つ新しいモデルを作成していました-これらのプロパティの値は、DataContext
の1つのインスタンスを使用してデータベースからロードされ、次にこの新しく作成されたモデルを最初にAdd()
、[DataContext
の別のインスタンスでSaveChanges()
。プロパティの値の取得と、新しいオブジェクトの実際の追加と保存の両方に同じインスタンスを使用し始めた後、すべてが機能し始めました。