繁体   English   中英

整rick实体框架一对一关系

[英]Tricky Entity Framework one to one relationship

我有一个应用程序,可以记录网球比赛的不同事件的条目。 它还记录每个事件的获胜者

有问题的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_EventId列? 我只希望Event.WinningEntryId列指向外键关系中的Entry.EntryId列。

我一定以某种方式做错了。 有人知道我该怎么做吗?

假设您的导航属性为:

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)

标记的答案完成了您需要执行的操作,但是导致您在表中获取Event_EventId的真正原因是因为:

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

在您的事件实体中注明。 这仅表示事件是相似条目的集合。 并以此逻辑在事件和条目之间建立一对多关系。

-事件有很多条目

-参赛作品属于一个事件

因此,每个条目都必须具有外键Event_EventId以声明该条目所属的事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM