如何配置Entity Framework Code First模型,以便在删除父项时,将字符串作为ID /外键的集合级联删除?
地理围栏=>集合在生成的代码中不包含OnDelete(DeleteBehavior.Cascade)
。车辆=>另一方面,旅行包含OnDelete(DeleteBehavior.Cascade)
。唯一相关的区别是车辆' ID是一个int,而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);
});
答案 0 :(得分:3)
唯一相关的区别是车辆的ID是一个int,而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