实体框架执行更新之前删除,我想停止这个
本文关键字:删除 执行 框架 更新 实体 | 更新日期: 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
模型,您所需要做的就是告诉实体Country
是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
后,将不会生成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以编程方式读取外键元数据