【问题标题】:entity framework perform update before delete, I want to stop this实体框架在删除之前执行更新,我想停止这个
【发布时间】:2016-10-03 07:17:27
【问题描述】:

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

  [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 中跟踪它时...实体框架在城市表中创建更新语句然后在国家表中删除语句...

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

我想停止这个..如果实体框架与任何表相关,我希望实体框架拒绝删除 有谁知道怎么解决这个问题???

【问题讨论】:

  • 不要让你的完整逻辑基于Entity Framework FK依赖,你应该在删除任何值之前检查依赖。
  • 我将如何检查 plz 因为我首先使用代码???我如何根据实体框架 FK 依赖项制作完整的逻辑

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


【解决方案1】:

用下面的代码替换你的City模型,你需要做的就是告诉实体City需要Country才能存在

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

【讨论】:

  • 谢谢我的主要问题解决了......但是如果该字段不需要......我想停止将任何 FK_ 更改为 null 当删除任何主键时......
  • 你必须告诉 EntityFramework 每个实体都需要关系。
  • 我希望它作为我的数据库,如果有任何 FK_ 实体框架必须提醒我。如果我忘记将 [Required] 放在实体中,可能实体框架将对我来说一些重要数据无效......
  • 如果我们忘记添加Required,我们没有按照我们应该的方式配置模型。那是在我们身上。我们在定义关系时必须小心。
  • 我明白了...谢谢:)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2012-01-19
    • 2011-11-12
    • 2011-09-30
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多