gpt4 book ai didi

entity-framework - 是否可以从集合中删除子级并解决SaveChanges上的问题?

转载 作者:行者123 更新时间:2023-12-03 11:49:06 25 4
gpt4 key购买 nike

我们正在使用具有外键关系的Entity Framework Code First。我们研究了在应用程序中处理从实体ICollection中删除对象的方法。

当我们拥有具有子关系的实体时,可以使用Add方法将对象直接添加到其ICollection中。现在,当您使用remove时,您会收到错误消息

System.InvalidOperationException occurred Message=The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.



我了解这是因为删除集合上的Remove仅通过使外键为零来删除关系。我们想在实体中编写业务逻辑并允许删除。

因此,从OrderRepository的Repostiory例如Order中取出根实体,然后调用该实体的某些特定方法,例如 Order.AddOrderline(Orderline orderline)这会将OrderLine添加到订单 virtual ICollection<OrderLine> OrderLines
但是,我们无法编写类似 Order.CancelOrderline(int orderLineId)的代码,因为仅从ICollection中删除会导致保存更改时出错。

似乎没有任何方法可以通过操纵对象集合来实现。显然,我们可以直接从Context中删除。但是,我想使其成为实体的一部分。我们可以在Entity Framework的SaveChanges事件中清理没有外键的某些实体吗?显然,需要告诉EF如果外键为空,则可以删除哪些实体。

目前,我们使用的是存储库模式,因此 Controller 无法访问上下文。我显然可以在Order资料库上使用OrderLine资料库或remove OrderLine方法。但是,只是想知道是否有可能在不引用持久性机制的情况下在实体上编写代码。

有什么想法吗?我们要解决所有这些错误吗?其他ORM是否允许您从子集合中删除?

最佳答案

我不知道以下是不是适合您的解决方案,但Entity Framework支持Identifying Relationships。在这种关系中,子实体(从属)到父级(主)的外键必须是子实体(复合)主键的一部分。例如,使用DbContext数据注释,您的模型类必须看起来像这样:

public class Order
{
[Key]
public int OrderId { get; set; }

public ICollection<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
[Key, ForeignKey("Order"), Column(Order = 1)]
public int OrderId { get; set; }

[Key, Column(Order = 2)]
public int OrderLineId { get; set; }

public Order Order { get; set; }
}

如果需要,可以使 OrderLineId为自动生成的身份。重要的是FK到 Order是PK的一部分。

例如这样的代码...
using (var ctx = new MyContext())
{
var order = ctx.Orders.Include("OrderLines").Single(o => o.OrderId == 1);
var orderLineToDelete = order.OrderLines
.FirstOrDefault(ol => ol.OrderLineId == 5);
if (orderLineToDelete != null)
order.OrderLines.Remove(orderLineToDelete);

ctx.SaveChanges();
}

...确实会从数据库中删除 orderLineToDelete

有关更多详细信息,请参见“识别和不识别关系的注意事项”部分中的 here

关于entity-framework - 是否可以从集合中删除子级并解决SaveChanges上的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com