实体框架执行更新之前删除,我想停止这个

本文关键字:删除 执行 框架 更新 实体 | 更新日期: 2023-09-27 18:11:18

我有实体框架的问题,我有两个代码一级国家和城市

  [Table("dbo.Countries")]
public class Country
{
    public int CountryId { get; set; }
    public string CountryNameAr { get; set; }
    public virtual ICollection<City> Cities { get; set; }
}
 [Table("dbo.Cities")]
public class City
{
    public int CityId { get; set; }
    public int CountryId { get; set; }
    public string CityNameAr { get; set; }
    public virtual Country Country { get; set; }
}
每个国家都有很多城市,我已经添加了一些国家和城市。我的问题是:当我删除任何国家,它会在城市更新国家id为null。并且我已经在DBContext中写了:
ModelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        ModelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

,当我跟踪它在SQL server…实体框架在城市表中更新语句,然后在国家表中删除语句…

exec sp_executesql N'UPDATE [dbo].[Cities]
SET [CountryId] = NULL
WHERE ([CityId] = @0)    
exec sp_executesql N'DELETE dbo.Countries
WHERE (CountryId = @0)',N'@0 int',@0=6

我想停止这个…我希望实体框架拒绝删除,如果他们是任何fk_相关的任何表有人知道如何解决这个问题????

实体框架执行更新之前删除,我想停止这个

用下面的代码替换您的City模型,您所需要做的就是告诉实体CountryCity存在所必需的:

[Table("dbo.Cities")]
public class City
{
    public int CityId { get; set; }
    public int CountryId { get; set; }
    public string CityNameAr { get; set; }
    [Required]
    public virtual Country Country { get; set; }
}

Country声明为Required后,将不会生成Nullable列的外键

您应该在删除数据之前检查依赖关系。如果存在外键依赖,并且试图删除表数据所依赖的主键值,则会抛出错误。有两个选择,要么手动检查依赖项,要么使用实体框架查找依赖项。对于手动检查列数据依赖性,下面的语法将查找计数。

using (var context = new YourDbContext())
{
    //check if the Country is not in used in City table
    var count = context.ModelNameGivenForCityDb.Count(u => u.CountryId== countryKeyToDelete);
    if(count == 0)
   {
      // code to delete
   }
}

另一个选择是在运行时使用EF查找外键依赖(注意,这种逻辑将使您的代码依赖于数据库约束)。检查下面的链接以查找外键依赖

使用Entity Framework 4以编程方式读取外键元数据