C# &引用;无法确定关联的主体端“;对于两个一对多关系

C# &引用;无法确定关联的主体端“;对于两个一对多关系,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有以下实体:设备和打印机 public class Device { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int DeviceId { get; set; } public int? DefaultPrinterId { get; set; } [ForeignKey("DefaultPrinterId")] public virtual Printer D

我有以下实体:
设备
打印机

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; }
}
设备和打印机之间有两种关系

  • 每台打印机可能托管在特定设备上,也可能不托管在特定设备上,这由
    打印机
    实体上的
    设备
    外键表示。这是一对多的关系
  • 默认情况下,每个设备将配置为使用特定打印机。这由
    DefaultPrinter
    外键表示。这是一对多的关系
当我用Entity Framework生成数据库时,我得到了一个错误:“无法确定关联的主体端”。要找到有关此错误如何与1对1关系相关的信息并不太难,但我还没有找到任何关于此错误如何与两个1对多关系相关的信息


有没有办法告诉EF我没有试图定义一对一关系?

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

设备
可以具有
默认打印机
,这意味着
打印机
可以是许多设备的“默认打印机”

使用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);
modelBuilder.Entity()
.has可选(i=>i.Device)
.WithMany()//另一侧没有导航属性
.HasForeignKey(i=>i.DeviceId);
modelBuilder.Entity()
.has可选(i=>i.DefaultPrinter)
.WithMany()//另一侧没有导航属性
.HasForeignKey(i=>i.DefaultPrinterId);
假设您想知道哪些设备具有特定的打印机作为其“默认打印机”

公共类设备
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共int设备ID{get;set;}
public int?DefaultPrinterId{get;set;}
公共虚拟打印机默认打印机{get;set;}
//这是新的
公共虚拟ICollection PrintersThatLoveMe{get;set;}
}
公共类打印机
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PrinterId{get;set;}
公共int?设备ID{get;set;}
公共虚拟设备{get;set;}
//这是新的
公共虚拟ICollection 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);
modelBuilder.Entity()
.has可选(i=>i.Device)
.WithMany(i=>i.PrintesThatLoveMe)
.HasForeignKey(i=>i.DeviceId);
modelBuilder.Entity()
.has可选(i=>i.DefaultPrinter)
.有很多(i=>i.爱我的设备)
.HasForeignKey(i=>i.DefaultPrinterId);

希望有帮助

我认为如果没有桥接表,您无法在EF中完成这项工作,因为设备和打印机需要共享一个键()。我认为您需要在设备中收集打印机,在打印机中收集设备。
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);