两个一对多关系中的“无法确定关联的主要结束”

时间:2016-01-08 17:39:42

标签: c# entity-framework ef-code-first

我有以下实体: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种关系

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

当我使用Entity Framework生成数据库时,我收到错误:“无法确定关联的主要结束”找到有关此错误与1对1关系的关系的信息并不太难,但是我还没有发现任何关于这与两个一对多关系的关系。

有没有办法告诉EF我不是要尝试定义一对一的关系?

1 个答案:

答案 0 :(得分:2)

问题是你没有指定" end"关系。因为这两种关系不是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);

让我们想象您想知道哪些设备具有特定打印机作为其默认打印机&#34;。

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);

希望它有所帮助!