在早期版本的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。若要设置复合主键,请使用fluent API。
我还尝试使用FluentAPI,如How to define nested Identifying Relationships Entity Framework code first在以下代码中所描述的那样:
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:实体类型‘父’和‘子’之间的关联已经被切断,但是这个关系的外键不能设置为null。如果应删除依赖实体,则设置关系以使用级联删除。
但我不想使用级联删除,我想使用识别关系!
请帮助我理解我做错了什么。谢谢!
发布于 2016-03-15 15:00:43
在delete上使用级联,因为这是它的用途:
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithOne(c => c.Parent);
.WillCascadeOnDelete(true);发布于 2018-11-20 23:00:51
万一有人看到这个错误,让我告诉你我是如何解决我的错误的:
在进行更新时,在EF上首先需要查询数据库并获取数据模型,然后将域层模型与更改映射到其中(基本上是将字段复制到数据上),最后调用DBContext update方法,然后保存更改。
我的问题是,我的模型(不是数据模型、域模型)上也有子对象。
下面是数据层模型(例如):
public class Parent
{
public int ChildId {get; set; }
[ForeignKey("ChildId")]
public virtual Child Child { get; set; }
}域层模型应该是这样的:
public class Parent
{
public int ChildId { get; set; }
//public Child Child { get; set; } // this caused the error, keep reading if you want to know more.
}当我看到错误时,我一直在使用Autofac的运行时映射程序将域层模型的属性映射到数据层模型。但是,域层模型中的子层为null,因此它将使数据层无效,从而导致错误:
“实体类型‘父’和‘子’之间的关联已被切断,但此关系的外键不能设置为null。如果应删除从属实体,则设置该关系使用级联删除。”
顺便说一下,在db上下文类中,我定义了以下关系:
modelBuilder.Entity<Parent>()
.HasOne(a => a.Child)
.WithMany()
.HasForeignKey(p => p.ChildId)
.OnDelete(DeleteBehavior.Restrict);起作用了。
https://stackoverflow.com/questions/36014595
复制相似问题