我有两张桌子,
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”忽略此属性。
如何正确配置?
您可以使用 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);