EntityManager.createEntity() - 策略表示用于用户输入生成的ID和默认值

2019-10-18 04:59发布

我有2个entites的1:M关系。

Vehicle (Id, RetailPrice, StockOn, VehicleInfoId) and 
VehicleInfo (Id, Year, Make, Model, ICollection<Vehicle>)

这两个ID是用户指定的(串),而是因为微风需要独特的键(哪怕是暂时的)我要创建与实体id = breeze.core.getUuid() 此外,年份和RetailPrice被设置为0(年份是int,RetailPrice是十进制)。

有一次,我结合这些实体的“新车形式”这些值immediatelly显示给用户的时候,其实我想他们是空白...什么是处理的最佳方式? 有些想法,我有如下:

  1. 添加额外的性能(通过初始值设定),并使用这些在表格上结合。 然后保存之前,交换性能。
  2. “消灭”这些在初始化(不是构造函数)特性....
  3. 使用自定义KO结合处理可能?

有没有更好的办法?

这里是我到目前为止(使用#2,但我不知道这是正确的)

/viewmodels/vehicleadd.js

var vehicle = ko.observable();
var viewModel = {
    title: 'Add New Vehicle',
    vehicle: vehicle,
};
return viewModel;
function activate() {
    vehicle(datacontext.createVehicle());
}

/services/datacontext.js

function init() {
    logger.debug(datacontext, 'Initializing data context...');
    return manager.fetchMetadata()
        .then(model.configureMetadataStore(manager.metadataStore))
        .then(model.applyValidators)
        //.then(loadLookups)
        .fail(initFailed);
}

function createVehicle() {
 var newVehicleInfo = manager.createEntity('VehicleInfo');
 var newVehicle = manager.createEntity('Vehicle');
 newVehicle.vehicleInfo(newVehicleInfo);

 return newVehicle;
}

/services/model.js

function configureMetadataStore(metadataStore) {
    logger.debug(model, 'Configuring metadata store...');
    extendVehicle(metadataStore);
    extendVehicleInfo(metadataStore);
}

function extendVehicle(metadataStore) {
    // --- custom constructor ---
    var vehicleCtor = function () {
        this.id = ko.observable(breeze.core.getUuid()); // must have for Breeze to work...
    };
    // --- initializer ---
    var vehicleInitializer = function (vehicle) {
        // defaults
        vehicle.id(null);                       // user to input
        vehicle.retailPrice(null);              // user to input
        vehicle.stockedOn(moment().format());   // set to current date & time
        // additional, non persisted properties
        vehicle.isBeingEdited = ko.observable(false);
        vehicle.isBeingSaved = ko.observable(vehicle.entityAspect.isBeingSaved);             
    };
    // --- register custom ctor & initializer ---
    metadataStore.registerEntityTypeCtor(EntityNames.Vehicle, vehicleCtor, vehicleInitializer);
}

function extendVehicleInfo(metadataStore) {
    // --- custom constructor ---
    var vehicleInfoCtor = function () {
        this.id = ko.observable(breeze.core.getUuid());
    };
    // --- initializer ---
    var vehicleInfoInitializer = function (vehicleInfo) {
        // defaults
        vehicleInfo.year = ko.observable(moment().format());
        // additional, non persisted properties
        vehicleInfo.isBeingEdited = ko.observable(false);
        vehicleInfo.isBeingSaved = ko.observable(vehicleInfo.entityAspect.isBeingSaved);
        // computed properties
        vehicleInfo.Description = ko.computed(function () {
            return vehicleInfo.year() + ' ' + vehicleInfo.make() + ' ' + vehicleInfo.model();
        });             
    };
    // --- register custom ctor & initializer ---
    metadataStore.registerEntityTypeCtor(EntityNames.VehicleInfo, vehicleInfoCtor, vehicleInfoInitializer);
}

更新#1

经过一些测试,看起来像2号查询时将无法正常工作。 之后(再)阅读“ 扩展实体 ”(DOC寻找“实体创建序列”段落),它专门说初始化函数是在两种情况下调用,创建和查询的情况下,实体时。 因此,“消灭”的ID,RetailPrice在初始化符查询和导入....

Answer 1:

我会考虑增加在初始化计算的读/写击倒(KO)。

当该值是一个GUID ...或者你制定任何其他唯一的临时值计算的“读”方将返回空白。

“写”边会(一)确认,在高速缓存中没有其他实体有这样的键,然后(B)覆盖新价值的关键。 因为它不再是“临时”的“读”的一面,现在会显示该值。

你在伤害,如果你正在使用的任何其他协会这些按键的世界; 你必须手动修复起来......也许你KO计算写逻辑里面。

我假设你已经为用户输入的值与数据库上的另一个关键,通过一些其他用户输入碰撞的可能性准备。

我就饶你语义键讲座(如“没有使用这些”); 我想,一些旧的数据库把你放在这个位置。



文章来源: EntityManager.createEntity() - Strategies for showing generated ids and default values for user input