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
有没有办法告诉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);