我有以下实体:Device
和Printer
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我不是要尝试定义一对一的关系?
答案 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);
希望它有所帮助!