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 列可以为空,因为我不想指定获胜者,因为锦标赛可能仍在进行中。

现在,问题是当我运行 Update-Database 命令时,它会生成以下表格:

Entry
 - EntryId
 - EventId
 - Event_EventId

Event
 - EventId
 - WinningEntryId

为什么 EF 在 Event 表中生成 Event_EventId 列?我只是希望 Event.WinningEntryId 列指向外键关系中的 Entry.EntryId 列。

我一定是在某种程度上做错了。有谁知道我怎么能做到这一点?

4

2 回答 2

5

假设您的导航属性:

public virtual Entry WinningEntryId { get; set; }

实际上被称为WinningEntry

public virtual Entry WinningEntry { get; set; }

然后实际上看起来您正在建模一对多关系,而不是一对一。一个事件可以有多个条目,而一个条目可以属于一个事件?只是其中一个条目将被标记为获胜条目。

我会考虑不使用数据注释,并坚持使用流畅的 API 来 a) 在一个中心位置管理所有配置和 b) 不将持久性问题与域对象混合。

在这种情况下,您可以使用 fluent API 配置映射,如下所示:

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

在您的 Event 实体中注明。这仅仅意味着一个事件是一个相似条目的集合。通过这种逻辑,在 Event 和 Entry 之间创建了一对多的关系。

-活动有很多条目

-条目属于一个事件

因此,每个条目必须有外键Event_EventId来说明条目属于哪个事件。

于 2012-11-26T03:02:41.150 回答