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

时间:2016-10-03 07:17:27

标签: c# asp.net .net asp.net-mvc entity-framework

我有实体框架问题我有两个代码第一类国家和城市

  [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; }

}

每个国家都有很多城市,,,我已经添加了一些国家和城市。 我的问题是:当我删除任何国家时,它会将城市中的countryId更新为null。 我已经在DBContext中写道:

ModelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        ModelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

当我在SQL server中跟踪它...实体框架在cities表中生成update语句然后删除country table中的语句...

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_ 任何人都知道如何解决这个问题????

2 个答案:

答案 0 :(得分:2)

使用下面的代码替换您的City模型,您只需要告诉实体Country存在<{1}} :< / p>

City

[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列。

答案 1 :(得分:1)

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

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查找外键依赖项(请注意,此逻辑将使您的代码依赖于数据库约束)。检查以下链接以查找外键依赖性

Read foreign key metadata programatically with Entity Framework 4