我们正在使用带有外键关系的Entity Framework Code First。我们正在研究如何处理在应用程序中从实体ICollection中删除对象的方法。
当我们有一个具有子关系的实体时,我们可以直接使用Add方法将对象添加到其ICollection中。现在当您使用remove时,会出现错误:
System.InvalidOperationException发生的消息=操作失败:无法更改关系,因为一个或多个外键属性是非可空的。当对关系进行更改时,相关联的外键属性将设置为null值。如果外键不支持null值,则必须定义新关系,将外键属性分配给另一个非null值或删除无关对象。
我了解这是因为从集合上的Remove仅通过设置外键为空来删除关系。我们希望在实体中编写业务逻辑并允许移除。
所以,从它的Repostiory中获取根实体,例如从OrderRepository获取Order,然后调用实体的某些特定方法,例如Order.AddOrderline(Orderline orderline)。这将向订单的virtual ICollection OrderLines添加一个OrderLine。
但是,我们不能像Order.CancelOrderline(int orderLineId)这样编写代码,因为仅从ICollection中删除会导致保存更改时出错。显然,我们可以直接从上下文中进行删除。但是,我想使其成为实体的一部分。是否可以在Entity Framework的SaveChanges事件中清理没有外键的某些实体?显然需要告诉EF可以删除哪些实体,如果它们具有空外键。
我们目前正在使用存储库模式,因此控制器无法访问上下文。我显然可以使用OrderLine存储库或Order存储库中的remove OrderLine方法。但是,只是想知道是否可能在实体上编写代码,而不引用持久性机制。你怎么看?我们做错了吗?其他ORM允许您仅从子集合中删除吗?
当我们有一个具有子关系的实体时,我们可以直接使用Add方法将对象添加到其ICollection中。现在当您使用remove时,会出现错误:
System.InvalidOperationException发生的消息=操作失败:无法更改关系,因为一个或多个外键属性是非可空的。当对关系进行更改时,相关联的外键属性将设置为null值。如果外键不支持null值,则必须定义新关系,将外键属性分配给另一个非null值或删除无关对象。
我了解这是因为从集合上的Remove仅通过设置外键为空来删除关系。我们希望在实体中编写业务逻辑并允许移除。
所以,从它的Repostiory中获取根实体,例如从OrderRepository获取Order,然后调用实体的某些特定方法,例如Order.AddOrderline(Orderline orderline)。这将向订单的virtual ICollection OrderLines添加一个OrderLine。
但是,我们不能像Order.CancelOrderline(int orderLineId)这样编写代码,因为仅从ICollection中删除会导致保存更改时出错。显然,我们可以直接从上下文中进行删除。但是,我想使其成为实体的一部分。是否可以在Entity Framework的SaveChanges事件中清理没有外键的某些实体?显然需要告诉EF可以删除哪些实体,如果它们具有空外键。
我们目前正在使用存储库模式,因此控制器无法访问上下文。我显然可以使用OrderLine存储库或Order存储库中的remove OrderLine方法。但是,只是想知道是否可能在实体上编写代码,而不引用持久性机制。你怎么看?我们做错了吗?其他ORM允许您仅从子集合中删除吗?
WithRequired
),则必须为OrderLine
定义一个复合 PK:modelBuilder.Entity<OrderLine>().HasKey(ol => new { ol.OrderId, ol.OrderLineId });
。 - Slaumathis.HasKey(c => new { c.ChildPrimaryKey, c.ParentPrimaryKey });
以及this.Property(c => c.ChildPrimaryKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
- David Masters