gpt4 book ai didi

c# - 棘手的 Entity Framework 一对一关系

转载 作者:太空狗 更新时间:2023-10-30 00:54:33 25 4
gpt4 key购买 nike

我有一个应用程序可以记录网球锦标赛不同项目的参赛情况。它还记录了每个事件的获胜者

有问题的 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 列。

我一定是做错了。任何人都知道我如何才能做到这一点?

最佳答案

假设您的导航属性:

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)

关于c# - 棘手的 Entity Framework 一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12436087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com