我有实体框架问题我有两个代码第一类国家和城市
[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_ 任何人都知道如何解决这个问题????
答案 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