在两个已有的表之间添加另一个一对多关系

问题描述 投票:0回答:1

我有两张桌子,

Accounts
Reservations
。它们之间存在一对多关系(一个帐户可以有多个预订),因此预订表有一个
AccountId
列。

public class Account 
{
    public Guid Id { get; set; }
    ...
    [JsonIgnore] 
    public List<Reservation> Reservations { get; set; } = new List<Reservation>();
}

public class Reservation 
{
    ...
    public Guid AccountId { get; set; }

    [JsonIgnore] 
    public Account Account { get; set; }
}

Entity Framework 自己解决了这个问题,我在

OnModelCreating()
中没有任何关于此关系的具体信息。

现在,当“父”帐户代表“常规”帐户创建预订时,我需要添加另一个类似的关系。因此,预订需要一个也指向帐户的

ParentAccountId
列。原来的关系需要保持原样。

我在 Reservation 类中添加了以下内容:

public Guid? ParentAccountId { get; set; }

[JsonIgnore] 
public Account? ParentAccount { get; set; }

现在 EF 不再能够自行重新建立关系,当我尝试重建数据库时,出现以下错误:

System.InvalidOperationException:无法确定“List”类型的导航“Account.Reservations”表示的关系。手动配置关系,或者使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

如何正确配置?

c# entity-framework-core .net-8.0
1个回答
0
投票

您可以使用 Fluent API 来“解释”您的意图:

modelBuilder.Entity<Account>()
    .HasMany(a => a.Reservations)
    .WithOne(r => r.Account);
modelBuilder.Entity<Reservation>()
    .HasOne(r => r.ParentAccount)
    .WithMany();

请注意,您无法将多个关系映射到同一个集合属性(因此是最初的错误),如果您希望公开它,则需要声明一个新关系:

public class Account 
{
    // ...

    [JsonIgnore] 
    public List<Reservation> ReservationsAsParent { get; set; } = new List<Reservation>();
}

和映射:

modelBuilder.Entity<Account>()
    .HasMany(a => a.Reservations)
    .WithOne(r => r.Account);        
modelBuilder.Entity<Account>()
    .HasMany(a => a.ReservationsAsParent)
    .WithOne(r => r.ParentAccount);
© www.soinside.com 2019 - 2024. All rights reserved.