web-dev-qa-db-ja.com

EFがid-columnにNULLを挿入しようとするのはなぜですか?

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

何が起こっている?

27
Kovpaev Alexey

これを見てください: https://stackoverflow.com/a/5338384/1717 -エンティティフレームワークは、CategoryIdフィールドがIDであると想定しているため、データベースにnullを渡して、データが入力されることを期待しています。あなたのために。

38
akiller

今日これに遭遇し、データベースからEFクラスを再生成する必要がありました。

それを行った後、EFが追加したことがわかりました。

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }

sQLのIdentity列であったこの「Id」フィールドに、アプリケーションが割り当てられるように変更されました。

その属性がない場合、EFは実際にIDをデータベースに送信しません( 'convention over configuration')

27
D.B. Fred

PKとしてint Idを使用してテーブルを作成しましたが、「ID仕様」= Trueに設定するのを忘れていました

5
Adam Cox

これをモデルクラスの.csファイルに追加してみてください。

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CategoryId { get; set; }

または、列のCategoryIdをidentityに変更します。

    CategoryId int IDENTITY(1,1)
2
Damir Varevac

Modelfモデルの最初の試行ブロック

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

今日も同じ問題に遭遇しました。

これが私が問題を理解した方法です。

最初にアイデンティティシードを列に追加しましたが、その後それを削除しました。そのため、コードの列定義を最初に変更すると、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); =

0
Vikas Sharma

私にとっては、デフォルト以外のスキーマがありました。 Idキーの名前は、そのスキーマ部分がいくらか欠けているものでした-データベース内で修正され、すべてうまくいきました。いかがでした;

PK_TableName

変更方法

PK_mySchema.TableName
0
marifrahman