[英]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.