如何配置实体框架代码第一个集合,其中字符串作为父ID的外键以级联删除?

时间:2018-04-10 20:29:39

标签: c# .net entity-framework entity-framework-6 entity-framework-core

如何配置Entity Framework Code First模型,以便在删除父项时,将字符串作为ID /外键的集合级联删除?

地理围栏=>集合在生成的代码中不包含OnDelete(DeleteBehavior.Cascade)。车辆=>另一方面,旅行包含OnDelete(DeleteBehavior.Cascade)。唯一相关的区别是车辆' ID是一个i​​nt,而Geofence的ID是一个字符串。

public class Geofence
{
    [JsonProperty(PropertyName = "id")]
    [Key]
    public string ID { get; set; }

    [JsonProperty(PropertyName = "color")]
    public string Color { get; set; }

    [JsonProperty(PropertyName = "coordinates")]
    [Required]
    public List<Coordinate> Coordinates { get; set; }
}

public class Coordinate
{
    [JsonIgnore]
    [Key]
    public string ID { get; set; }

    [JsonIgnore]
    public string GeofenceID { get; set; }

    [JsonProperty(PropertyName ="lat")]
    [Required]
    public double Latitude { get; set; }

    [JsonProperty(PropertyName = "lng")]
    [Required]
    public double Longitude { get; set; }
}

 public class Vehicle
 {
    [Key]
    public int ID { get; set; }
    public string VehicleName { get; set; }

    public List<Trip> Trips { get; set; }
 }

  public class Trip
 {
    [Key]
    public int ID { get; set; }
    public int VehicleID { get; set; }

    public bool InProgress { get; set; }

    public DateTime Start { get; set; }
 }

生成配置代码:

modelBuilder.Entity("VTWeb.Models.Coordinate", b =>
            {
                b.HasOne("VTWeb.Models.Geofence")
                    .WithMany("Coordinates")
                    .HasForeignKey("GeofenceID");
            });

        modelBuilder.Entity("VTWeb.Models.VehicleViewModels.Trip", b =>
            {
                b.HasOne("VTWeb.Models.VehicleViewModels.Vehicle")
                    .WithMany("Trips")
                    .HasForeignKey("VehicleID")
                    .OnDelete(DeleteBehavior.Cascade);
            });

1 个答案:

答案 0 :(得分:3)

  

唯一相关的区别是车辆的ID是一个i​​nt,而Geofence的ID是一个字符串

这是非常重要的区别,因为string是引用类型,因此默认情况下可以为空。因此,如果没有其他配置,关系将被视为https://www.raywenderlich.com/164608/uicollectionview-custom-layout-tutorial-pinterest-2,并且可选关系的默认删除行为是级联。

有几种方法可以配置级联删除,最明显的是流畅的API。但是,最简单的方法是建立所需的关系。您需要知道的唯一事情是[Required]属性在应用于集合导航属性时无效 - 它必须应用于引用导航属性或FK财产。

在您的示例中,没有引用导航属性,因此它必须位于FK属性上:

public class Coordinate
{
    // ...
    [JsonIgnore]
    [Required] // <--
    public string GeofenceID { get; set; }
    //..
}

请注意,对值类型属性([Required]int应用double属性就像在您的示例等中一样)并没有伤害,但是因为它们无法保持{{1值。对于值类型,optional基本上由您是否使用可空类型控制。因此null属性的主要用途是[Required]和参考导航属性。

为了完整性,或者如果你想保持关系可选并且仍然有级联删除,这里是所需的最小流畅配置:

string