2014-10-20 52 views
1

我想在Angular/Breeze应用程序中删除父项和子项实体。微风删除父指导PK和孩子被修改

支持存储是一个代码优先的实体框架。

的实体如下:

public class Ingredient 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    public virtual ICollection<IngredientDescription> Descriptions { get; set; } 

} 

public class IngredientDescription 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    public Guid IngredientId { get; set; } 

    [ForeignKey("IngredientId")] 
    public virtual Ingredient Ingredient { get; set; } 

    public string Description { get; set; } 

    [Required] 
    public int Culture { get; set; } 
} 

当我删除的成份,我需要删除IngredientDescription。我试过两种方法,我先删除(儿童,父母或父母,然后是孩子)。

每当我删除成分(父母)时,微风将儿童IngredientDescription.IngredientId设置为Guid.Empty或{0000-0000 -...}。这导致儿童实体处于Modified状态(与已删除的对象已经设置它们相对)。

我已经尝试过所有我能想到的,以便从客户端代码中获得此功能。我已经通过预览控制器中的更改并将其重新标记为已删除来实现它。但是,我想只是从客户那里得到它的工作。

我不必为了防止Breeze将其从“已删除”修改为“已修改”而删除级联删除。

我的客户方功能如下:

 function removeIngredient(ingredient) { 

     var descriptions = ingredient.descriptions; 

     for (var d = 0; d < ingredient.descriptions.length; d++) { 
      var thisDescription = ingredient.descriptions[d]; 
      thisDescription.entityAspect.setDeleted(); 
     } 

     ingredient.entityAspect.setDeleted(); 

    } 

我如何能保持微风从标记为修改后,我已经将其标记为删除的子对象有什么想法?

下面是一个孩子的EntityState被设置为从removeFromRelations调用修改的图像。

a busy cat http://s3.amazonaws.com/stack-overflow-tjb/problem.png

回答

0

好吧,我刚刚重新测试微风的删除逻辑(在微风版本1.5.0),试图确认您的问题,并一直无法瑞普你看到的行为。回顾一下,执行删除的顺序确实很重要。

  • 然后删除父删除儿童

    • 这标志着父为删除,将迫使孩子们的外键为null或关键取决于默认值的更新外键属性是否可为空。这个规则的一个例外是微风不会尝试修改主键,所以如果子键的外键也是主键的一部分,则微风不会尝试修改它。

    • 所有的子导航属性现在都将返回空数组或null,具体取决于导航属性是标量还是非标量。此时,由于外键改变,每个孩子将标记为修改为

    • 然后孩子们会分别标记删除。然后

  • 删除儿童的父(推荐)

    • 孩子们每个人都可以打上删除。外键不会改变,但相应的导航属性将返回null,而不是返回父项。此时,以前返回这些子项的所有父级导航属性现在将返回null或空数组。
    • 父标被标记为删除。它的任何一个孩子都没有改变(因为它没有任何改变)。

我一直无法瑞普实体在何处设置的修改的实体状态已被删除后的情况。但是,这可能是早期版本Breeze中的一个错误,所以请使用最新版本进行测试。

+0

您好变为如下的功能。感谢您花时间研究这一点。我们正在使用以下微风版本: 版本:“1.5.0”, metadataVersion:“1.0.5” 我已经添加了一个图像到原始的职位,其中子实体被设置为修改。请让我知道这是否有帮助。请让我知道我还能做些什么来帮助你。 你认为这与Guid的关键类型有关吗? 再次感谢。 – 2014-10-21 13:30:36

+0

我似乎无法重现您的问题。我已经尝试过Guid和Ints。我的模型唯一的区别是我的外键是空的,听起来像你的不是。你的成分描述本身是否有孩子?如果你可以用breeze.js示例中的DocCode模型重新编译,我可以修复它。 DocCode中最接近的对象将是Customer和Orders实体。客户的关键是一个GUID,它有一个'订单'属性,其中每个订单都将客户的CustomerID作为外键。 – 2014-10-21 20:40:15

2

我相信这个问题是在删除儿童

for (var d = 0; d < ingredient.descriptions.length; d++) { 
    var thisDescription = ingredient.descriptions[d]; 
    thisDescription.entityAspect.setDeleted(); 
} 

通过借助setDeleted(设置记录删除),记录正在被从数组中删除循环。因此,记录被跳过删除,然后当试图保存父母FK违规即将到来。

我用而长度> 0

function removeIngredient(ingredient) { 
     while (ingredient.descriptions.length > 0) { 
      ingredient.descriptions[0].entityAspect.setDeleted(); 
     } 

     ingredient.entityAspect.setDeleted(); 

    } 
+0

我有完全相同的问题 - 如果我有一个以上的孩子,我会得到一个外键违规,因为有些孩子被跳过。这解决了我的问题。谢谢 – emaia 2016-03-16 22:44:47