一对一对零的关系不起作用?



我一直试图在 2 个实体之间建立可选的一对一关系,但没有成功。 我可以通过在RTUDEVICE表上创建一个唯一约束来做到这一点DeviceId,但我正在尝试通过 Fluent API 以"正确的方式"做到这一点

我做错了什么?

关系说明
一个设备记录在RTUDEVICE表中可以有一个且只有一个记录。

实体:
以下是实际类的简化版本...

public partial class Device
{
public Int Id { get; set; }
public string DeviceName { get; set; }
public virtual RTUDevice RTUDevice { get; set; }
}
public partial class RTUDevice
{
public Int Id { get; set; }
public int DeviceId { get; set; }
public bool IsCRMAlarmDevice { get; set; }
public bool HasCustomRegisters { get; set; }
public bool HasGasQualityRegisters { get; set; }
public bool HistoryVerified { get; set; }
public virtual Device Device { get; set; }
}

映射:
我使用各种在线示例进行了多次尝试,但没有成功......失败的代码被注释掉。

public DeviceMap(DbModelBuilder modelBuilder)
{
ToTable("Device", "dbo")
.HasKey(m => m.Id);
Property(m => m.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.IsRequired();
Property(m => m.DeviceName)
.IsUnicode(false)
.HasMaxLength(100)
.IsRequired()
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UX_Device_AlternateKey") { IsUnique = true }));
//modelBuilder.Entity<RTUDevice>()
//    .HasOptional(e => e.Device)
//    .WithRequired(e => e.RTUDevice)
//    .WillCascadeOnDelete(true);
}
public RTUDeviceMap(DbModelBuilder modelBuilder)
{
ToTable("RTUDevice", "dbo")
.HasKey(m => m.Id);
Property(m => m.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.IsRequired();
Property(e => e.DeviceId)
.IsRequired();
Property(e => e.IsCRMAlarmDevice )
.IsRequired();
Property(e => e.HasCustomRegisters)
.IsRequired();
Property(e => e.HasGasQualityRegisters)
.IsRequired();
Property(e => e.HistoryVerified)
.IsRequired();
// One-to-Zero-or-One relationship
//modelBuilder.Entity<RTUDevice>()
//    .HasOptional(e => e.Device)
//    .WithRequired(e => e.RTUDevice)
//    .WillCascadeOnDelete(true);
// One-to-Zero-or-One relationship
//modelBuilder.Entity<RTUDevice>()
//    .HasRequired(e => e.Device)
//    .WithMany()
//    .HasForeignKey(c => c.DeviceId)
//    .WillCascadeOnDelete(true);
}

您应该在RTUDevice实体中使用Id作为PK(以及FK(并摆脱DeviceId。然后按如下方式定义关系:

modelBuilder.Entity<Device>()
.HasKey(it => it.Id);
modelBuilder.Entity<RTUDevice>()
.HasKey(it => it.Id);
modelBuilder.Entity<Device>()
.HasOptional(it => it.RTUDevice)
.WithRequired(it => it.Device);

如果需要显式使用 DeviceId 进行映射,请使用以下命令:

modelBuilder.Entity<Device>()
.HasOptional(it => it.RTUDevice)
.WithOptionalPrincipal(it => it.Device)
.Map(it => it.MapKey("DeviceId"));

最新更新