c# - Entity Framework 6 更正外键关系
问题描述
我正在尝试纠正下面的关系。出于某种原因,在 ChildClass 上设置的主键使用了 ParentClassId 和 ChildClassId 的组合,而它应该刚刚使用 ChildClassId。
public partial class ParentClass
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ParentClassId { get; set; }
public DateTime SomeDate { get; set; }
public string SomeString { get; set; }
public virtual ICollection<ChildClass> ChildClasses { get; set; }
}
public partial class ChildClass
{
[Key, ForeignKey("ParentClass"), Column(Order = 1)]
public int ParentClassId { get; set; }
[Key, Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ChildClassId { get; set; }
public virtual ParentClass ParentClass { get; set; }
public DateTime SomeDate { get; set; }
public string SomeString { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ParentClass>()
.HasMany(e => e.ChildClasses)
.WithRequired(e => e.ParentClass);
}
到目前为止,我有:
public partial class ParentClass
{
public int ParentClassId { get; set; }
public DateTime SomeDate { get; set; }
public string SomeString { get; set; }
public virtual ICollection<ChildClass> ChildClasses { get; set; }
}
public partial class ChildClass
{
public int ChildClassId { get; set; }
public int ParentClassId { get; set; }
public virtual ParentClass ParentClass { get; set; }
public DateTime SomeDate { get; set; }
public string SomeString { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ParentClass>()
.HasMany(e => e.ChildClasses)
.WithRequired(e => e.ParentClass);
}
这提供了一个迁移脚本,它只是按预期删除并重新创建主键。
现在,当我加载父对象时,清除子对象并重新创建它们,然后尝试保存更改
ParentClass p = await db.ParentClasses.Include("ChildClasses").SingleOrDefaultAsync(r => r.ParentClassId == 1).ConfigureAwait(false);
p.ChildClasses.Clear();
ChildClass c = new ChildClass { SomeDate = DateTime.Now, SomeString="some string" };
p.ChildClasses.Add(c);
await db.SaveChangesAsync().ConfigureAwait(false); //<< Error on this
我得到错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
表和关联的键、索引等看起来不错。该SaveChanges
行没有到达数据库,因此模型中的某处(我看不到)似乎不尊重更新的关系。
编辑:根据阅读,我也尝试过如下迭代并得到相同的错误。
foreach (ChildClass t in p.ChildClasses.ToList()) p.ChildClasses.Remove(t);
我错过了什么?
解决方案
Clear()
方法不会删除ChildClasses
集合中的实体。如果您认为ChildClass
可以没有ParentClass
,则应将外键设为可为空
public int? ParentClassId { get; set; }
那么它应该可以工作
推荐阅读
- ios - Mapbox ios 应用条件 lineDashPattern
- android - RecyclerView 在 ScrollView 中无法正常工作
- javascript - 为什么 Tailwind "focus:" 样式不使用默认状态挂钩激活?
- android - 运营商更新或播放服务更新后,三星 S21 在 ADB 上显示离线
- c# - 通过括号引用方法
- javascript - 如何从 json 解码中解析正确的值
- r - 为什么我无法更新 R
- r - 读取嵌套文件夹和文件名,导出为 Excel 文件
- javascript - 点击项目时如何使用jquery滑动到指定区域?
- react-native - webView 在 TapgestureHandler 中无法正常工作