处理可能被丢弃的新breeze实体的正确方法是什么?

处理可能被丢弃的新breeze实体的正确方法是什么?,breeze,Breeze,我确信我在这里制造了我自己的痛苦,但我正在努力理解事件的正确顺序,以便在我的场景中管理创建新实体 在我的模型中,我有两个对象,ObjectA和ObjectB都继承自BaseObject,显然每个对象都有自己的附加属性 在我看来,由于大多数信息都是相同的,我希望用户能够选择一个选项来创建一个。因此,他们填写SharedProperty1和SharedProperty2,这是一个集合导航属性,选择一个选项以确定他们想要的是a还是B对象,然后填写最后一个页面,该页面具有最后一个特定于对象的属性 在用户

我确信我在这里制造了我自己的痛苦,但我正在努力理解事件的正确顺序,以便在我的场景中管理创建新实体

在我的模型中,我有两个对象,ObjectA和ObjectB都继承自BaseObject,显然每个对象都有自己的附加属性

在我看来,由于大多数信息都是相同的,我希望用户能够选择一个选项来创建一个。因此,他们填写SharedProperty1和SharedProperty2,这是一个集合导航属性,选择一个选项以确定他们想要的是a还是B对象,然后填写最后一个页面,该页面具有最后一个特定于对象的属性

在用户选择此选项之前,我不知道要创建哪个实体,因此我在viewmodel中构建了一个对象来处理此临时数据。作为其中的一部分,当他们填写SharedProperty2集合时,当他们添加新的ChildObject时,我使用entityManager.createEntity'ChildObject'创建它们。然后,当它们到达末尾时,我创建ObjectA或ObjectB实体并添加子实体和其他属性,然后尝试保存

问题是它永远不会正确保存,但根据我采取的方法,我会得到不同的结果。因此,因为用户可以中止新的对象进程,所以我创建了EntityState.Distached的ChildObject,因为我认为如果将它们扔掉会更容易。但我意识到,所有以这种方式创建的实体都会获得id键0。因此,当我将ChildEntite添加到父对象ObjectA或ObjectB时,我修复了这些键,方法是将它们分配为递减的负数,即:-1,-2,等等。这导致了一些疯狂的服务器端行为,只有一些实体被保存到db中,并且抱怨外键冲突

这也有一股难闻的气味,我没有正确理解,我把它弄得一团糟。因此,现在我尝试正常创建实体,即:没有分离标志,它们都会获得自己的唯一键。breeze似乎遵循-1、-2等,但现在,当我尝试将它们从临时viewmodel集合复制到父对象集合时,出现了一个错误,即已附加具有此键的实体。所以现在我甚至不能建立正确的模型来保存

我仍然认为,我还没有完全正确地理解如何处理这个问题,因此,我们将非常感谢一些建议


为了避免我所怀疑的问题,为什么我没有使用RejectChanges来处理被丢弃的实体。基本上,用户可以添加一个ChildObject对象,该对象由breeze entityManager创建,添加到viewmodel集合,绑定到UI,然后决定再次删除它。在保存数据之前,当前刚从viewmodel集合中删除。如果我使用拒绝更改,我会丢弃其他重要的实体。如果有人删除视图中的ChildObject,我想我现在会是一个好孩子,并使用正确的分离方法。

如果我正确理解您的问题,您正在尝试创建一些属性,然后在保存时将它们添加到父对象集合中。如果我错了,请纠正我,但微风不仅支持这一点,而且非常有效。由于来自.NET和C,我很难理解这有多容易,但如果我是你,我会这么做-

var childA = ko.observable();
var childB = ko.observable();

childA(entityManager.createEntity('ChildObject')); // populate your children
childB(entityManager.createEntity('ChildObject')); // populate your children
然后,您可以在视图中编辑它们,当您准备好保存时,只需将它们添加到集合中即可

var save = function() {
    isSaving(true);
    var parent = ko.observable();
    return entityManager.getParent(parent, parentId)
            .then(setParents)
            .fail(catchError);

    function setParents() {
        childA().parent(parent());
        childB().parent(parent());
        entityManager.saveChanges()
                .then(complete)
                .fail(catchError);

        function complete() {
            isSaving(false);
            return Q.resolve();  // Don't know if you have any unresolved conflicts
        }
    }  
};
基本上,我们是-

A:创建实体 B:编辑它们而不进行任何更改 C:当我们调用save时,我们正在设置它们的父导航属性。在我之前的方式中,无论是对是错,我都会简单地设置ParentIdparentId,让EF知道如何导航,但请原谅我的双关语“这是微风伴微风”。我们也可以很容易地传递一个父对象,而不必从管理者那里获取它,这取决于我们是否已经拥有它


如果要单独管理实体,另一种方法是使用entityManager.saveChanges[childA]一次性保存单个实体。只需传入一个包含要保存的单个实体的数组。如果您正在处理多个实体,但这些实体尚未准备好保存,并且您需要在应用程序中导航,那么这可能非常有用。除非调用cancelChanges,否则Breeze只会将实体保留在缓存中,直到您准备再次使用它。通过这种方式,只需调用处于isAdded状态的实体,您就可以将它们拉回来并再次编辑。

您对该行为的精彩解释基本上就是我所做的。这里的问题是,如果我最终不想使用ChildA或ChildB,那么具体如何处理它,因为它在创建时附加到实体管理器,如果我没有正确处理它,它就会被保存
Y结果是一个简单的调用删除它,正确地分离它。谢谢,如果它回答了你的问题,你想把它标记为接受或投票,我不介意: