我有一个域模型,它有一个客户,它又具有 1 个地址 (1:1) 和 1 个或多个电话号码 (1:M)。客户有用户提供的 PK(字符串),而地址和电话使用身份列(服务器生成)。
我正在努力了解如何为“添加新客户”屏幕管理 Breeze 实体创建。屏幕上的表格允许用户输入客户、地址和电话数据。
我正在使用 Durandal 和 Knockout,所以我的“customeradd.js”视图模型看起来像这样:
// -- snip ---
var customer = ko.observable(),
hasChanges = ko.computed(function () {
return datacontext.hasChanges();
});
var vm = {
hasChanges: hasChanges,
customer: customer,
activate: activate
};
return vm;
function activate() {
customer(datacontext.createCustomer());
}
// -- snip ---
和我的“/services/datacontext.js”:
// -- snip ---
breeze.NamingConvention.camelCase.setAsDefault();
var manager = new breeze.EntityManager(config.remoteServiceName);
var hasChanges = ko.observable(false);
manager.hasChangesChanged.subscribe(function (eventArgs) {
hasChanges(eventArgs.hasChanges);
});
function createVehicle() {
return manager.createEntity("Customer");
}
// -- snip ---
我的问题如下:
- 创建客户后,是否需要创建地址和电话列表并将其添加到客户实体,然后才能使其成为可观察的 KO?或者这是通过 createEntity() 方法自动完成的?
- 如何创建客户但无需指定 ID?如果我将键设置为 null 或 '',Breeze 会抱怨(“错误:无法将对象附加到 EntityManager 而不先设置其键或将其 entityType 'AutoGeneratedKeyType' 属性设置为 'None' 以外的值”)。但是,如果我生成临时密钥(使用轻风.core.getUuid() 或其他),那么它会显示在我的 Id 表单字段中,我真的希望最终用户指定它....我有吗诉诸使用额外字段扩展实体,然后在保存之前进行交换和验证(我根本不喜欢这个想法)?有没有更好的办法?
- 为了启用/禁用表单上的按钮,我正在跟踪 EntityManager 中是否有更改。但是每次创建实体时,它都会自动处于“添加”状态,因此 hasChanges 为真。我想要的是仅在用户编辑表单时才进行更改(因此对底层实体进行更改)。解决这个问题的最佳方法是什么?
顺便说一句,我已经看到了为实体注册自定义构造函数的建议(我已经实现了它,但我仍然不清楚如何让用户提供他们自己的 id 并仅在用户编辑实体时将其标记为已修改......)