EFコアコンポジットキー、1つの外部、1つの自動インクリメント

c# entity-framework entity-framework-core sql-server

質問

私はこのエンティティを持っています:

public class PlayerScoreHistory
{
    public int Id { get; set; }

    public int PlayerScoreId { get; set; }

    public DateTime ScoreWhen { get; set; }
}

これらのIdフィールドの両方から複合キーを作成する必要があります。 PlayerScoreIdへの外部キーである必要がPlayerScore.IdIdは自動増分IDである必要があります。

だから、私は次のようになった:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<PlayerScoreHistory>()
        .HasKey(x => new { x.Id, x.PlayerScoreId });
}

これは複合キーを私に与えます。私はAdd-Migration Initialを使って初期移行を行った。

外部キーを取得するには、 constraintsパラメータにその行を追加するだけです。

 migrationBuilder.CreateTable(
    name: "PlayerScoreHistories",
    columns: table => new
        {
            Id = table.Column<int>(nullable: false),
            PlayerScoreId = table.Column<int>(nullable: false),
            ScoreWhen = table.Column<DateTime>(nullable: false)
        },
    constraints: table =>
        {
            table.PrimaryKey("PK_PlayerScoreHistories", x => new { x.Id, x.PlayerScoreId });
            table.ForeignKey("FK_PlayerScoreId", arg => new {  arg.PlayerScoreId}, "PlayerScores", "Id");
        });

だから2つの質問:

  1. OnModelCreatingメソッドで外部キーの作成を取得するにはどうすればよいですか?
  2. Id列をDatabase Generatedフィールドにして、EF Coreが値を設定しようとしないことを確認するにはどうすればよいですか?

私は、EFコアが非常に新しくなっているのを見て、私には何の選択肢が開いているのか正確にはわかりません...

私が得る2つのエラー:

1。

Id columnパラメータ設定にこの行を追加すると、次のようになります。

Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)

私は得る

SQL IDENTITY_INSERTがOFFに設定されている場合、テーブル 'テーブル'のID列に明示的な値を挿入できません[重複]

2。

行を削除してエンティティを追加しようとすると、次のようになります。

カラムId nullを挿入できません


明らかに私はどこかの間にいる....


そんなに編集しないで

Id列を削除し、 ScoreWhenとしてPlayerScoreIdScoreWhenを使用することにしPlayerScoreId

しかし、私がまだ持っている1つの質問は、ナビゲーションプロパティを持たずに、外部キーとしてOnModelCreatingアイデンティティPlayerScoreIdを作る方法です.....

受け入れられた回答

しかし、私がまだ持っている1つの質問は、ナビゲーションプロパティを持たずに、外部キーとしてOnModelCreatingアイデンティティPlayerScoreIdを作る方法です.....

いつものようにHasForeignKeyと組み合わせたナビゲーションプロパティを指定しないで、 HasOne / WithMany (またはHasMany / WithOne )メソッドを使用できます:

modelBuilder.Entity<PlayerScoreHistory>()
    .HasOne<PlayerScore>()
    .WithMany()
    .HasForeignKey(e => e.PlayerScoreId);

人気のある回答

まず、移行ファイルを編集することで、必要なデータベースが得られますが、EFランタイムはこれらの変更を認識しません。実行時に必要なすべての情報は、モデル内でのみ設定する必要があります。

したがって、あなたは例外を得る

SQL IDENTITY_INSERTがOFFに設定されている場合、テーブル 'テーブル'のID列に明示的な値を挿入できません[重複]

EFランタイムはID列を認識しないため、insert文のID列の値として0( default(int) )を送信しdefault(int)

私は2番目の例外を得ることができないので、EFはint型のプロパティにnullを挿入しようとしません(&できない)。

あなたの質問に答えてください:

  1. イワンの答えは正しい。これがモデルビルダに外部キーを設定する方法です。

    modelBuilder.Entity<PlayerScoreHistory>()
        .HasOne<PlayerScore>()
        .WithMany()
        .HasForeignKey(e => e.PlayerScoreId);
    

リレーションシップの設定方法の詳細については、 https://ef.readthedocs.io/en/latest/modeling/relationships.htmlを参照してください。

  1. Idがデータベース生成フィールドであることを知らせるには、modelbuilderで次のコードを使用します。

    modelBuilder
        .Entity<PlayerScoreHistory>()
        .Property(e => e.Id)
        .ValueGeneratedOnAdd();
    

これにより、エンティティの挿入中にId値が生成され、 ValueGeneratedOnAddに対して1つの整数列のみがコンフィグレーションされている場合、SqlServerはIdentity変換されます。生成されたプロパティの詳細はhttps://ef.readthedocs.io/en/latest/modeling/generated-properties.html#value-generated-on-addにあります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ