4

テニストーナメントのさまざまなイベントへのエントリーを記録するアプリがあります。また、各イベントの勝者が誰であったかを記録します

問題の2つのクラスは次のとおりです。

public class Event {
  public int EventId { get; set; }
  public string EventName { get; set; }
  public virtual ICollection<Entry> Entries { get; set; }
  public int? WinningEntryId { get; set; }

  [ForeignKey("WinningEntryId")]
  public virtual Entry WinningEntry { get; set; }
}

public class Entry {
  public int EntryId { get; set; }
  public int EventId { get; set; }

  [ForeignKey("EventId")]
  public virtual Event Event { get; set; }
}

トーナメントがまだ進行中の可能性があるため、勝者を指定する必要がないため、Event.WinningEntryId列はnull可能であることに注意してください。

ここで、問題は、Update-Databaseコマンドを実行すると、次のテーブルが生成されることです。

Entry
 - EntryId
 - EventId
 - Event_EventId

Event
 - EventId
 - WinningEntryId

EFがイベントテーブルにEvent_EventId列を生成するのはなぜですか?Event.WinningEntryId列が外部キー関係のEntry.EntryId列を指すようにしたいだけです。

私はどういうわけかこれを間違っているに違いありません。誰かが私がこれを達成する方法を知っていますか?

4

2 に答える 2

5

ナビゲーションプロパティを想定すると、次のようになります。

public virtual Entry WinningEntryId { get; set; }

実際には呼ばれWinningEntryます:

public virtual Entry WinningEntry { get; set; }

実際には、1対1ではなく、1対多の関係をモデル化しているように見えます。イベントには多くのエントリを含めることができ、エントリは1つのイベントに属することができますか?それらのエントリの1つが勝者エントリとしてマークされるだけです。

データアノテーションを使用せず、流暢なAPIを使用して、a)すべての構成を一元的に管理し、b)永続性の問題をドメインオブジェクトと混合しないことを検討します。

この場合、FluentAPIを次のように使用してマッピングを構成できます。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{     
    modelBuilder.Entity<Event>()
       .HasOptional(ev => ev.WinningEntry)
       .WithMany()
       .HasForeignKey(ev => ev.WinningEntryId)
       .WillCascadeOnDelete(false);

    modelBuilder.Entity<Entry>()
        .HasRequired(en => en.Event)
        .WithMany(ev => ev.Entries)
        .HasForeignKey(en => en.EventId);
}

これにより、以下との関係がモデル化されます。

Events
    EventId (PK)
    EventName
    WinningEventId (FK, null)

Entries
    EntryId (PK)
    EventId (FK, not null)
于 2012-09-15T13:48:45.767 に答える
1

マークされた答えはあなたがする必要があることを達成します、しかしあなたがEvent_EventIdあなたのテーブルに入っていた理由についての本当の理由はこれのためです:

public virtual ICollection<Entry> Entries { get; set; }

イベントエンティティに記載されています。これは単に、イベントが類似したエントリのコレクションであることを意味します。そして、そのロジックによって、イベントとエントリの間に1対多の関係を作成します。

-イベントには多くのエントリがあります

-エントリは1つのイベントに属します

したがって、各エントリにはEvent_EventId、エントリが属するイベントを示す外部キーが必要です。

于 2012-11-26T03:02:41.150 に答える