2

在 EF Core 2.2 中使用代码优先时,我遇到了困难。

我有一个名为:AirSensor 的实体,我需要与 TemperatureSensor 建立两个一对一的关系,因为 AirSensor 能够读取温度和露点温度。

因此我的代码在这里:

public class AirSensor
{
    public long AirSensorId { get; set; }        
    public TemperatureSensor TemperatureSensor { get; set; }
    public HumiditySensor Humidity { get; set; }   
    public Enthalpy EnthalpyCalc { get; set; }
    public TemperatureSensor DewPointTemperatureSensor { get; set; }

    public long TemperatureSensorId { get; set; }
    public long HumiditySensorId { get; set; }
    public long EnthalpyId { get; set; }
    public long DewPointTemperatureSensorId { get; set; }  
}

温度实体是:

public class TemperatureSensor
{
    public long TemperatureSensorId { get; set; }
    public string Name { get; set; }
    public float CurrentValue { get; set; }
    public DateTime LastUpdated { get; set; }
    public ICollection<TemperatureMeasurement> Measurements { get; set; }
}

当我添加迁移时,一切都很好,但是在更新数据库时它失败了:

执行 DbCommand 失败 (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

ALTER TABLE [AirSensors] 添加约束 [FK_AirSensors_TemperatureSensors_DewPointSensorId] 外键 ([DewPointSensorId]) 参考 [TemperatureSensors] ([TemperatureSensorId]) ON DELETE CASCADE; System.Data.SqlClient.SqlException (0x80131904): Si especifica la restrictción FOREIGN KEY 'FK_AirSensors_TemperatureSensors_DewPointSensorId' en la tabla 'AirSensors', podrían producirse ciclos o múltiples rut​​as en cascada。Especifique ON DELETE NO ACTION o UPDATE NO ACTION, o bien modifique otras restrictciones FOREIGN KEY。

但是,我没有看到这里的问题,我只想有两个单独的一对一关系。

我错过了什么?

提前谢谢了!

4

1 回答 1

1

配置AirSensor如下Fluent API

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Entity<AirSensor>().HasOne(ars => ars.TemperatureSensor)
            .WithOne().HasForeignKey<AirSensor>(ars => ars.TemperatureSensorId)
            .OnDelete(DeleteBehavior.Restrict);

     modelBuilder.Entity<AirSensor>().HasOne(ars => ars.DewPointTemperatureSensor)
            .WithOne().HasForeignKey<AirSensor>(ars => ars.DewPointTemperatureSensorId)
            .OnDelete(DeleteBehavior.Restrict);
 }

现在它将按预期工作!

于 2019-03-09T02:32:35.250 回答