【问题标题】:How to create two one-to-one relations with same entity in Entity Framework Core [duplicate]如何在Entity Framework Core中创建两个与同一实体的一对一关系[重复]
【发布时间】:2019-07-30 19:40:24
【问题描述】:

在 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。

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

我错过了什么?

非常感谢!

【问题讨论】:

  • 您是否在 dbcontext 中进行任何自定义映射?您可能必须在 AirSensor 类上明确标记您的 ForeignKeys。
  • 无自定义映射。但有趣的是,它只适用于一对一的关系
  • 看这个问题,特别是OnModelCreating中的流畅API映射:stackoverflow.com/questions/5559043/…
  • 让我知道是否这样做或者您是否需要进一步的帮助

标签: asp.net-core entity-framework-core ef-core-2.2


【解决方案1】:

如下配置AirSensorFluent 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);
 }

现在它将按预期工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2019-08-07
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多