";无法确定关联的主要端“;两个一对多的关系

本文关键字:两个 关系 一对多 无法确定 quot 关联 | 更新日期: 2023-09-27 18:29:29

我有以下实体:DevicePrinter

public class Device
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DeviceId { get; set; }
    public int? DefaultPrinterId { get; set; }
    [ForeignKey("DefaultPrinterId")]
    public virtual Printer DefaultPrinter { get; set; }
}
public class Printer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PrinterId { get; set; }
    public int? DeviceId { get; set; }
    [ForeignKey("DeviceId")]
    public virtual Device Device { get; set; }
}

设备和打印机之间有2种关系

  • 每个打印机可能托管在特定的设备上,也可能不托管在特定设备上,这由Printer实体上的Device外键表示。这是一种一对多的关系
  • 默认情况下,每个设备都将配置为使用特定的打印机。这由DefaultPrinter外键表示。这是一种一对多的关系

当我用实体框架生成数据库时,我会得到错误:"无法确定关联的主体端"不难找到关于这个错误如何与一对一关系相关的信息,但我还没有找到任何关于这如何与两个一对多关系相关的信息。

有什么方法可以告诉EF我并没有试图定义一对一的关系吗?

";无法确定关联的主要端“;两个一对多的关系

问题是您没有指定关系的"结束"。因为这两种关系不是1-1,而是1-n。

Device可以有DefaultPrinter,这意味着Printer可以是许多设备的"默认打印机"。

它可以通过使用Fluent API轻松解决(删除现有的[ForeignKey]属性)。像这样:

modelBuilder.Entity<Printer>()
    .HasOptional(i => i.Device)
    .WithMany() //we don't have navigation property on the other side
    .HasForeignKey(i => i.DeviceId);
modelBuilder.Entity<Device>()
    .HasOptional(i => i.DefaultPrinter)
    .WithMany() //we don't have navigation property on the other side
    .HasForeignKey(i => i.DefaultPrinterId);

让我们想象一下,您想知道哪些设备将特定的打印机作为其"默认打印机"。

public class Device
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DeviceId { get; set; }
    public int? DefaultPrinterId { get; set; }
    public virtual Printer DefaultPrinter { get; set; }
    //that's new
    public virtual ICollection<Printer> PrintersThatLoveMe { get; set; }
}
public class Printer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PrinterId { get; set; }
    public int? DeviceId { get; set; }
    public virtual Device Device { get; set; }
    //that's new
    public virtual ICollection<Device> DevicesThatLoveMe { get; set; }
}

映射:

modelBuilder.Entity<Printer>()
    .HasOptional(i => i.Device)
    .WithMany(i => i.PrintesThatLoveMe)
    .HasForeignKey(i => i.DeviceId);
modelBuilder.Entity<Device>()
    .HasOptional(i => i.DefaultPrinter)
    .WithMany(i => i.DevicesThatLoveMe)
    .HasForeignKey(i => i.DefaultPrinterId);

希望它能有所帮助!