我在做数据库模型导航属性时,碰到这样一个问题。比如我有2个表 HkGoods 和 MallGoods 它们都有一个导航属性 public List<Parameter> Parameter { get; set; } = new List<Parameter>(); 导航属性里设置的外键是通过Sid指向商品的Id。在DbContextOptions里的OnModelCreating如下设置
modelBuilder.Entity<MallGoods>().HasMany(e => e.Parameter).WithOne().HasForeignKey(p => p.Sid).OnDeLete(DeleteBehavior.NoAction).IsRequired(false); modelBuilder.Entity<HkGoods>().HasMany(e => e.Parameter).WithOne().HasForeignKey(p => p.Sid).OnDelete(DeleteBehavior.NoAction).IsRequired(false);
奇怪的是我在一台电脑上使用这个导航属性能正常的更新与添加数据。在另外一台电脑上就会显示外键冲突的错误具体表现为INSERT 语句与 FOREIGN KEY 约束"FK_Parameter_HkGoods_Hid"冲突。该冲突发生于数据库"Housekeeping",表"dbo.HkGoods", column 'Id' 。然后我经过研究发现出现此问题的根本原因是 比如上面的语句 当我准备更新或则MallGoods 的导航属性时,数据库会检测HkGoods是否有相应的数据。很明显,我上面的设计都是指向Id,所以为MallGoods添加Parameter时HkGoods 必然会没有对应的数据,就会产生报错。(但奇怪的是我在另外一台电脑上不会出现这样的问题,数据库还都是sql server 2016,所以我想可能也跟数据库有关系)。
明天了问题的所在那么就可以进行解决了,其实方法就很简单。
一:直接删除掉数据库里的外键约束
但这样做,会影响EfCode里的数据迁移。因为直接删除掉外键约束,那么肯定就跟我们的efcode数据模型不一致了。
二:在数据库里做设置
根据我上图里的标注,我们将 在创建或重新启用时检查现有 选择否 然后在 强制外键约束也选择否 然后保存修改。(特别注意保存修改是在设计里保存,就是我们为表添加字段的那个设计的地方保存),这样数据库就不会做检测基表的Id。导航属性就可以正常的添加数据了。