我们正在使用Entity Framework Code First和Foreign Key关系.我们正在调查处理从应用程序中的实体ICollection中删除对象的方法.
当我们有一个具有子关系的实体时,我们可以使用Add方法将对象直接添加到他们的ICollection中.现在,当您使用删除时,您会收到错误
发生System.InvalidOperationException消息=操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我理解这是因为集合上的Remove仅通过归零外键来删除关系.我们想在我们的实体中编写业务逻辑并允许删除.
所以从它的Repostiory中取出root实体,例如OrderRepository的Order然后调用实体的一些特定方法,例如,Order.AddOrderline(Orderline orderline)这将OrderLine添加到Ordersvirtual ICollection<OrderLine> OrderLines
但是,我们无法编写代码,Order.CancelOrderline(int orderLineId)因为只是从ICollection中删除会导致存储更改出错.
似乎没有任何方法可以通过操纵对象集合来实现这一点.显然我们可以直接从Context中删除.但是我想把它作为实体的一部分.我们可以在Entity Framework的SaveChanges事件中清除没有外键的某些实体吗?显然需要告诉EF如果它们具有空外键,可以删除哪些实体.
我们目前正在使用存储库模式,因此控制器无法访问上下文.我显然可以在Order存储库上使用OrderLine存储库或删除OrderLine方法.然而,只是想知道是否有可能在实体上编写代码而不引用持久性机制.
思考?我们这一切都错了吗?其他ORM是否允许您从Child Collections中删除?
persistence entity-framework repository-pattern entity-framework-4
我有一个"请求"实体与"RequestProperty"实体的关系为1 ..*.所以在"请求"中有一组RequestProperty对象.当我更新"请求"时,我想删除RequestProperty EntityCollection中的所有项目,并添加来自传入域对象的新项目.当我遍历Request.Properties集合并调用项目中的remove或a DeleteObject时,枚举失败,因为集合已被修改.
截至目前我正在这样做:
while (true)
{
if (newRequest.Properties.Count > 0)
context.RequestPropertySet.DeleteObject(newRequest.Properties.First());
else
break;
}
Run Code Online (Sandbox Code Playgroud)
由于这不是真的"酷",我认为必须有另一种方法来清空一个关系的集合.谢谢你的想法.
我正在使用DDD.我有一个类Product,它是一个聚合根.
public class Product : IAggregateRoot
{
public virtual ICollection<Comment> Comments { get; set; }
public void AddComment(Comment comment)
{
Comments.Add(comment);
}
public void DeleteComment(Comment comment)
{
Comments.Remove(comment);
}
}
Run Code Online (Sandbox Code Playgroud)
保持模型的层根本不知道EF.问题是,当我打电话时DeleteComment(comment),EF抛出异常
"Product_Comments"AssociationSet中的关系处于"已删除"状态.给定多重约束,相应的'Product_Comments_Target'也必须处于'已删除'状态.
即使从集合中删除元素,EF也不会删除它.如何在不破坏DDD的情况下解决这个问题?(我正在考虑建立一个评论库,但是不对)
代码示例:
因为我正在尝试使用DDD,它Product是一个聚合根,它有一个存储库IProductRepository.如果没有产品,则注释不能存在,因此是ProductAggregate 的子项,并Product负责创建和删除注释.Comment没有存储库.
public class ProductService
{
public void AddComment(Guid productId, string comment)
{
Product product = _productsRepository.First(p => p.Id == productId);
product.AddComment(new Comment(comment));
}
public void RemoveComment(Guid productId, Guid commentId)
{
Product product = …Run Code Online (Sandbox Code Playgroud)