相关疑难解决方法(0)

关系处于已删除状态

当我试图清除一个集合(调用.Clear)时,我得到以下异常:

保存不公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源.通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常.有关详细信息,请参阅InnerException.

内在的例外是:

来自'User_Availability'AssociationSet的关系处于'已删除'状态.给定多重约束,相应的'User_Availability_Target'也必须处于'已删除'状态.

用户看起来像这样:

....
ICollection<Availability> Availability { get; set; }
Run Code Online (Sandbox Code Playgroud)

可用性如下所示:

int ID { get; set; }
User User { get; set; }
DateTime Start { get; set;
DateTime End { get; set; }
Run Code Online (Sandbox Code Playgroud)

配置如下:

HasMany(x => x.Availability).WithRequired(x => x.User);
HasRequired(x => x.User).WithMany(x => x.Availability);
Run Code Online (Sandbox Code Playgroud)

导致问题的代码是:

user.Availability.Clear();
Run Code Online (Sandbox Code Playgroud)

我已经看过其他替代方法,比如使用DbSet删除项目,但我觉得我的代码不会那么干净.有没有办法通过清除集合来实现这一目标?

c# entity-framework ef-code-first entity-framework-5

29
推荐指数
1
解决办法
2万
查看次数

是否可以从收集中删除子项并解决SaveChanges上的问题?

我们正在使用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

21
推荐指数
1
解决办法
2万
查看次数