【发布时间】:2016-07-01 02:07:22
【问题描述】:
在以前的 EF 版本中,我可以使用以下代码来实现识别关系:
public class Child
{
[Key, Column(Order = 1)]
public virtual int Id { get; set; }
[Key, Column(Order = 2)]
public virtual int ParentId { get; set; }
public virtual Parent Parent { get; set; }
}
需要像这样轻松地从集合中删除一个孩子:
var parent = _context.Parents.First();
var child = parent.Children.First();
parent.Children.Remove(child);
_context.SaveChanges();
http://www.kianryan.co.uk/2013/03/orphaned-child/(方法#2)中描述了这种方法。
但在 EF7 中,此代码在创建迁移时会引发异常:
执行解析操作时引发异常。见 InnerException 了解详细信息。 ---> 实体类型“子”具有复合 使用数据注释定义的主键。设置复合主要 关键,使用流利的API。
我还尝试在以下代码中使用 How to define nested Identifying Relationships Entity Framework code first 中描述的 FluentAPI:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithOne(c => c.Parent);
modelBuilder.Entity<Child>()
.HasKey(c => new {c.Id, c.ParentId});
base.OnModelCreating(modelBuilder);
}
这种方法允许成功生成迁移,但是当我尝试从Children 集合中删除一个孩子时,我得到了以下异常:
System.InvalidOperationException:实体类型之间的关联 'Parent' 和 'Child' 已被切断,但其外键 关系不能设置为空。如果依赖实体应该是 删除,然后设置关系以使用级联删除。
但我不想使用级联删除,我想使用识别关系!
请帮助我理解我做错了什么。谢谢!
【问题讨论】:
-
您想彻底删除孩子吗?或者您只想删除父子关系?
-
@MihailStancescu,是的,我想删除关系和孩子。
-
您应该按照错误消息的说明配置级联删除。或者您必须手动删除您一开始不想要的孩子。
-
@MihailStancescu 我试过了,效果很好。看来我已经了解它的工作原理了...非常感谢!
标签: c# entity-framework entity-framework-core ef-fluent-api