【问题标题】:How to undelete an entity with EntityState deleted如何取消删除删除了 EntityState 的实体
【发布时间】:2016-08-05 05:50:55
【问题描述】:

我有一个具有复合主键的实体,它模拟了多对多关系:

public class ActualAnswer
{
    [Key]
    [Column(Order = 0)]
    public int AnsweredQuestionID { get; set; }

    [Key]
    [Column(Order = 1)]
    public int AnswerID { get; set; }

}

如果我使用 Breeze 在我的客户端应用程序中删除这些实体之一,它的状态将设置为已删除:

function deleteEntity(entity) {
    var ea = entity.entityAspect;
    ea.setDeleted();
}

如果用户改变主意,我目前正在尝试重新创建实体:

createEntity("ActualAnswer", {
    AnsweredQuestionID: answeredquestionid,
    AnswerID: answerid
});

使用我的 Breeze EntityManager 调用此函数:

function createEntity(entityType, initialValues) {
    var entity = manager.createEntity(entityType, initialValues)
    return entity;
}

但是,这会导致错误:

“不允许”的 MergeStrategy 不允许您附加实体 当已附加具有相同密钥的实体时: 实际答案:#etc

确实,我们已经有一个具有相同键的实体 - 但它处于“已删除”状态。

那么,我怎样才能找回它并取消删除它呢?

或者,我可以安全地使用不同的合并策略吗?我需要注意哪些陷阱?我可以通过仅对这个特定实体使用合并策略来最小化风险吗?

【问题讨论】:

    标签: breeze


    【解决方案1】:

    这是我能找到从缓存中检索已删除项目并取消删除它们的唯一方法:

    //A MergeStrategy of 'Disallowed' does not allow you to attach an entity 
    //when an entity with the same key is already attached
    //so we need to check for deleted entities and undelete them
    var queryOptions = manager.queryOptions.using({
        includeDeleted: true,
        fetchStrategy: breeze.FetchStrategy.FromLocalCache
    });
    
    var existing = EntityQuery
        .from('ActualAnswers')
        .where('AnsweredQuestionID', '==', this.ID)
        .where('AnswerID', '==', answerid)
        .using(queryOptions)
        .using(manager)
        .executeLocally();
    
    if (existing.length > 0 && existing[0].entityAspect.entityState.isDeleted()) {
        //rejectChanges fixes navigation properties. setUnchanged doesn't
        existing[0].entityAspect.rejectChanges(); 
    }
    else {
        createEntity("ActualAnswer", {
            AnsweredQuestionID: this.ID,
            AnswerID: answerid
        });
    }
    

    【讨论】:

      【解决方案2】:

      您为什么不直接将状态更改为已修改?

      function unDeleteEntity(entity) {
          var ea = entity.entityAspect;
          ea.setModified();
      }
      

      【讨论】:

      • 实体建模多对多关系。如果用户删除该关系,则应在服务器上将其标记为删除。如果用户随后重新创建关系,则就服务器而言,它处于未更改的状态。没什么可修改的。这并没有告诉我如何检索已删除的实体以取消删除它
      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多