我正在尝试纠正以下关系。出于某种原因,ChildClass上设置的主键本应使用ChildClassId时使用ParentClassId和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);
}
这提供了一个迁移脚本,该脚本将按预期方式删除并重新创建主键。
现在,当我加载父对象时,清除Child对象并重新创建它们,然后尝试保存更改
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);
我想念什么?
答案 0 :(得分:1)
Clear()
方法不会删除ChildClasses
集合中的实体。如果您认为ChildClass
可以不包含ParentClass
,则应将外键设置为可空
public int? ParentClassId { get; set; }
,那么它应该可以工作