56

EF CTP 4を使用しています。EFを使用してSQLデータベースにデータを挿入する単純なコンソールアプリ(テスト用)があります。

アイテムを挿入すると問題が発生しました

using(var context = GetContext())
{
   BOB b = new BOB();
   b.Id = 1;

   context.Bobs.Add(b);
   context.SaveChanges();
}

エラーがスローされます:{"値NULLを列'Id'、テーブル'TestDB.dbo.BOB'に挿入できません;列はnullを許可しません。INSERTは失敗します。\r\nステートメントは終了しました。"}

テーブルには、主キーであり、自動インクリメントされたIDではないId intNOTNULLのフィールドが1つだけあります。

DataContextの作成時に、この構成がありますが、これは実行されます。

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<BOB>().HasKey(b => b.Id);
    builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}

また、このテーブルを事前に入力してから、デバッガーを介してこのBOBオブジェクトをウォッチロードできるようになりました...したがって、BOBをロードできることは、すべてが正しいことを示しているので、本当に困惑しています...しかし新しいものを挿入すると、クラッシュします...

4

10 に答える 10

77

私はここで同じ問題を抱えています、そしてそれは本当に醜い解決策です。

 [Key]
public Int64 PolicyID { get; set; }

これは自動生成された番号ではありません

それから私は同じエラーをヒットしました。

EFコードファーストCTP5

これを適用した後:

 [Key]
 [DatabaseGenerated(DatabaseGeneratedOption.None)]
 public Int64 PolicyID { get; set; }

その後、それは動作します。

于 2011-02-24T06:53:39.957 に答える
33

私は使用してEF 4.1, Model Firstいて、この問題に遭遇しました。これが私がそれを解決した方法です:

モデルデザイナサーフェスを使用する場合、エンティティを作成するときにKeyプロパティを定義する必要があります。デフォルトはId, int32。です。

私の状況では、を使用することを選択しGuidsたので、をIdに切り替えます。しかし、エンティティを作成した後でこのIDを調べると、IDが選択されていることがわかりました。最初はそれが問題だとは思いませんでしたが、データベースへの挿入に使用されているSQLを調べたところ、IDが送信されなかったという点で少し奇妙でした。 イライラする!int32Guid'StoreGeneratedPattern''identity'

しかし、戻ってをに変更し'StoreGeneratedPattern'、データベース'identity''none'再生成してプロジェクトを再構築すると、この奇妙なメッセージは発生しなくなりました。

列'Id'、テーブル'TestDB.dbo.BOB'に値NULLを挿入できません。列はnullを許可しません。INSERTは失敗します。ステートメントは終了されました。

参考までに-SQLをもう少し表示すると、をidentity選択したStoreGeneratedPattern場合、EFはオブジェクトをdb(sans Id)に保存し、すぐにIDを取得してオブジェクトに保存します。つまり、この選択は、コードStoreGeneratedPatternではなく、データベースに依存してIDを生成します

于 2011-03-17T11:29:16.277 に答える
31

明示的に指定してみましたStoreGeneratedPatternか?

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
        .Property(p => p.Id)
            .StoreGeneratedPattern = StoreGeneratedPattern.None;

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
于 2010-12-15T09:48:52.140 に答える
6

あなたも使うことができます

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
    .Property(p => p.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
于 2018-09-13T19:37:45.930 に答える
3

dbのスキーマの尊重された列(ID列)に主キーがない場合に発生しました。SSMSエクスポートツールを使用して新しいデータベースを作成し、SQLサーバー間でデータをエクスポートしましたが、キーなしでデータのみをエクスポートしていることに気づきませんでした。

于 2013-05-08T09:19:37.263 に答える
1

私も同じような状況でしたが、私の場合は設定Identityoffても役に立ちませんでした。

この問題は、エンティティモデルに追加できなかった主キーに関連していました。

モデルを生成していたスクリプトは次のとおりです。

 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
});

これもその説明です。

于 2018-04-02T21:45:26.207 に答える
0

データベースファーストアプローチを使用している場合は、最初にedmxダイアグラムからそれぞれのエンティティを削除してから、データベースからモデルを更新します。これにより、問題は確実に解決されます。

于 2019-07-21T15:14:00.310 に答える
0

私の場合、EntityFrameworkはContext.csクラス内で次のコードを生成しました。

modelBuilder.Entity<MODEL_OF_TABLE>(entity =>
{
    entity.Property(e => e.Id).ValueGeneratedNever(); // <= this line must remove
    ...
}

この行を削除した後、問題は解決しました。

于 2019-10-25T07:39:26.350 に答える
0

この問題にも遭遇しました。私にとって、Dev DBテーブルは何らかの理由でキーを引き継がなかったため、EFは私のIDをキーとして定義しませんでした。

この問題を抱えている人への注意: IDフィールドを使用して新しいレコードを挿入しようとしているテーブルが、実際にContextクラスで定義されていることを確認してください。

modelBuilder.Entity<CustomerEmail>(entity =>
        {
            entity.HasKey(e => e.Id)
                .HasName("PK_tblCustomerEmail");

            entity.Property(e => e.Customer).IsUnicode(false);

            entity.Property(e => e.Email).IsUnicode(false);
        });
于 2021-06-18T13:50:03.503 に答える
-1

この質問はどういうわけか時代遅れであり、受け入れられた解決策がすでに見つかっていることを私は知っていますが、私が私の発見を共有するならばそれは役に立つだろうと思いました。

同じの2つの異なるインスタンスを使用していたため、今日このエラーが発生しましたDataContext。いくつかのプロパティを使用して新しいモデルを作成していました。これらのプロパティの値は、の1つのインスタンスを使用してデータベースから読み込まれDataContext、次に、この新しく作成されたモデルをデータベースにプッシュして、最初Add()に呼び出し、次にSaveChanges()の別のインスタンスを呼び出しようとしましたDataContext。プロパティの値の取得と実際に新しいオブジェクトの追加と保存の両方に同じインスタンスを使用し始めた後、すべてが機能し始めました。

于 2017-11-07T16:44:43.597 に答える