【问题标题】:Breeze one-to-many deletion - children entities FKs set to 0Breeze 一对多删除 - 子实体 FK 设置为 0
【发布时间】:2014-01-30 23:39:57
【问题描述】:

我已经阅读了有关导航属性、级联删除等的 Breeze 文档。我已经成功地通过级联删除和 Breeze 使一对多关系按预期工作。关于以下代码如何失败,我已经没有什么想法了,我们将不胜感激。

下面的代码类似于 DocCode Breeze 文档中的 OrderOrderDetail 类:

public class Order
{
        public int OrderId { get; set; }
        public String Title { get; set; }
        public virtual ICollection<OrderDetail> OrderDetails { get; set; }
}

public class OrderDetail
{
        public int OrderDetailId { get; set; }
        public String Comment { get; set; }

        public int OrderId { get; set; }
        [ForeignKey("OrderId ")]
        [InverseProperty("OrderDetails ")]
        public Order Order { get; set; }
}

public class MyDbContext : DbContext
{
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // Use singular table names
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();


            modelBuilder.Entity<Order>()
                        .HasMany(t => t.OrderDetails)
                        .WithRequired(t => t.Order)
                        .HasForeignKey(t => t.OrderId)
                        .WillCascadeOnDelete();

            base.OnModelCreating(modelBuilder);
        }
}

Order 实体被删除时,我拦截BeforeSaveChanges 并从SaveMap 中删除所有OrderDetail 对象,因为数据库将负责删除子实体。

问题 当我创建 OrderDetail 对象时,这些对象会正确添加到数据库中,并且我的 Breeze 客户端成功地读取这些对象并将它们正确关联。但是,当我通过order.entityAspect.setDeleted(); 删除Order 对象时,子OrderDetails 与它们删除的父Order 一起被发送到服务器。问题是OrderDetails 实体OrderId 属性设置为0。这引发了一个大问题,因为我无法确定要从SaveMap 中删除哪个OrderDetail 对象

【问题讨论】:

  • 您确定[ForeignKey("OrderId ")] 属性应该标记Order 属性而不是OrderId 属性吗? "OrderId ""OrderDetails " 中的空格看起来也很可疑
  • 我认为它应该在“订单”上。将其设置在“OrderId”上会出现错误

标签: c# javascript breeze


【解决方案1】:

在服务器上,EntityInfo.OriginalValuesMap 将具有已删除订单 ID 的原始值。

【讨论】:

  • 谢谢杰,我怎样才能避免这一切?即让 Breeze 为我保留这些 ID?或者这是默认的 Breeze 行为?
  • 这是默认行为。这个想法是,当您删除外键指向的实体时,我们应该将外键值设置回其“默认”值(通常为 0 或 null)。也就是说,我们已经考虑过使其可配置。如果您认为这对您有用,请发布到 User Voice。
  • 我现在可以从服务器端的SaveMap 中删除这些。如何告诉我的客户忘记已在服务器上删除的OrderDetails(通过级联删除自动删除)?
  • 您需要在保存完成之前或之后自己在客户端上执行此操作。还有一个关于此的用户语音请求:breezejs.uservoice.com/forums/173093-breeze-feature-suggestions/…。如果你觉得它是个好主意,请投票给它。
  • 我刚刚做了 :) 非常感谢您的帮助。如果其他人需要,会尝试写博客。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多