【问题标题】:Nullable<System.DateTime> and BreezeJSNullable<System.DateTime> 和 BreezeJS
【发布时间】:2013-05-09 09:58:47
【问题描述】:

我有这门课:

公共部分类 VehicleSize { 公共车辆尺寸() { }

    public System.Guid VehicleSizeId { get; set; }
    public int Title { get; set; }
    public int SizeOrder { get; set; }
    public System.DateTime DateCreated { get; set; }
    public Nullable<System.DateTime> DateDeleted { get; set; }

}

我正在使用 BreezeJS。

Nullable 的处理似乎有点奇怪。该字段是可选的。但它一直抱怨,直到我从 javascript 中明确设置 DateDeleted = null 。如果我不将该字段设置为 null,我将收到“保存 TypeError 时出现问题:entity.dateDeleted 为 null”。

如果我在 javascript 中检查 .dateDeleted 属性,它似乎是一个 javascript Date 对象,但 getTime 是 NAN。在这种情况下,它不应该为 null 并且 BreezeJS 验证器跳过验证它,因为该字段为 null。

来自服务器的元数据将字段定义为:

"name": "删除日期", "type": "Edm.DateTime", “可空”:“真”

有人知道我如何创建可选的 DateTime 字段吗?


继续我的原始帖子。该问题似乎与将实体从一个实体管理器导出到另一个实体管理器有关。以“null”开头的日期字段在再次导入后变为“无效日期”,如下代码所示:

        var vehicleSizeId = 'E9DA5803-BB65-4751-AA22-17B54A1EE7C1';
        alert('getting vehicle from db');

        var query = breeze.EntityQuery
            .from("VehicleSizes")
            .where("vehicleSizeId", "==", vehicleSizeId);

        var em = new breeze.EntityManager("api/Todo");
        em.enableSaveQueuing(true);

        var sandBoxEm = em.createEmptyCopy();
        sandBoxEm.enableSaveQueuing(true);

        em.executeQuery(query)
           .then(function (data) {
               alert('Found the vehicle size in the original entity manager')
               var entity = data.results[0];
               alert('Org Date Deleted == ' + entity.dateDeleted); // Its null at this point


               var bundle = em.exportEntities();
               sandBoxEm.importEntities(bundle, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });


           });


        sandBoxEm.executeQuery(query)
            .then(function (data) {
                alert('Found the vehicle size')
                var entity = data.results[0];
                alert('Date Deleted == ' + entity.dateDeleted); // Now its invalid date
                entity.sizeOrder = entity.sizeOrder + 1;
                entity.titleTranslation.text = entity.titleTranslation.text + "_x";
                //entity.titleTranslation.dateDeleted = null;
                //entity.dateDeleted = null;
                try {
                    sandBoxEm.saveChanges().then(
                        function () {
                            alert('It saved ok');
                        }).fail(
                            function (error) {
                                var firstItem = error.entitiesWithErrors[0];
                                var firstError = firstItem.entityAspect.getValidationErrors()[0];
                                var msg = "prop: " + firstError.property.parentType.name + " = " + firstError.errorMessage;
                                alert(msg);
                            }
                        );
                }
                catch (ex) {
                    alert( "Problem saving " + ex );
                }
            }

            ).fail(

            function () {
                alert('Getting the vehicle size failed');
            });

【问题讨论】:

    标签: breeze


    【解决方案1】:

    编辑:2013 年 5 月 8 日 - 导入先前导出的空日期的问题现已在 v 1.3.3 中得到修复,并可在 Breeze 网站上找到。


    不确定您遇到了什么。我刚刚编写了一个单元测试来尝试确认您所看到的内容并且无法重现您的问题。我正在针对“birthDate”也定义为 Nullable 的 Employee 模型运行此操作。

    所有测试都通过这个:

     var em = newEm();  // creates a new EntityManager
     var emp = em.createEntity("Employee", { firstName: "Joe", lastName: "Smith" });
     ok(emp.entityAspect.entityState === breeze.EntityState.Added, "entityState should be 'Added'");
     var birthDate = emp.getProperty("birthDate");
     ok(birthDate === null, "birthDate should be null");
     var q = EntityQuery.from("Employees").where("birthDate", "==", null);
    
     stop();
     em.executeQuery(q).then(function(data) {
        var empsWithNullBirthDates = data.results;
        ok(empsWithNullBirthDates.length > 0, "should be at least 1 employee with a null birthdate");
        empsWithNullBirthDates.forEach(function(emp) {
           var birthDate = emp.getProperty("birthDate");
           ok(birthDate === null, "queried birthDate should be null");
        });
     }).fail(testFns.handleFail).fin(start);
    

    【讨论】:

    • 感谢您的回复杰。这个故事似乎还有更多内容。这似乎是在导出和导入之间处理空日期的方式。 sandboxEm 中的实体与 em 中的实体不同(甚至认为 sandBoxEm 在导入之前完全是空的)。 var bundle = em.exportEntities(); sandBoxEm.importEntities(bundle, { mergeStrategy:breath.MergeStrategy.OverwriteChanges });
    • 好的,感谢您的澄清。这是一个错误,应该在下一个版本中修复(可能是 v 1.3.3)。
    • 谢谢,期待下一个版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多