1

我正在使用基于 SPA 的应用程序作为概念证明并且遇到问题。

我的 SPA 使用的是 BreezeJS、Durandal、Knockout 和 WebApi。对于数据访问层,我以代码优先的方式使用 Entity Framework 5。

我有两个类,如下:

public class TodoList : IEntity
{
    public TodoList()
    {}

    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<TodoItem> Items { get; set; }
}

public class TodoItem : IEntity
{
    public int Id { get; set; }

    public string Description { get; set; }

    public DateTime? DueDate { get; set; }

    public TodoList TodoList { get; set; }

    public int? TodoListId { get; set; }
}

然后在我的网络项目中,我创建了一个视图和视图模型来列出所有的 TodoLists(视图模型如下 - 我已经将代码压缩到这个视图模型中,因为我实际上使用的是来自 BreezeJS 样本的存储库和工作单元模式网站):

define(['services/entitymanagerprovider', 'plugins/router'],
    function (entitymanagerprovider, router) {

    var todoLists = ko.observableArray();
    var provider = entitymanagerprovider.create();
    var manager = provider.manager();

    function activate() {
        var entityTypeName = "TodoList";
        var resourceName = "data/TodoLists";

        if (entityTypeName) {
            entityType = manager.metadataStore.getEntityType(entityTypeName);
            entityType.setProperties({ defaultResourceName: resourceName });
            manager.metadataStore.setEntityTypeForResourceName(resourceName, entityTypeName);
        }

        var query = breeze.EntityQuery
                        .from(resourceName);

        manager.executeQuery(query)
             .then(function (data) {
                return todoLists(data.results);
             })
             .fail(function(error) {
                console.log(error);
             });
    }

    return {
        activate: activate,
        todoLists: todoLists
    };
});

但是,当我运行该页面时,出现以下错误:

对象 # 没有方法 'getProperty'

我已经调查了这个错误,它发生在 BreezeJS 代码中。我相信我的一个实体没有被 EntityType 包装,这意味着无法调用“getProperty”函数......虽然这只是一个非常粗略的猜测!

我已经在我的数据访问代码中检查了两个对象之间的关系,并且我已经在子对象 (TodoItem) 上公开了外键和父对象。

顺便说一句,我实际上有另一个 SPA 原型使用​​与上述相同的技术,但它使用的是以前版本的 BreezeJS 和 Durandal。另一个 SPA 可以工作,但是当我使用目前正在处理的 SPA 时出现错误。我目前使用的版本是:

BreezeJS:1.4.2(元数据版本 1.0.5)

杜兰达尔:2.0.0

任何帮助将不胜感激!谢谢。

4

1 回答 1

1

在断断续续地查看了几天后,我设法解决了它。首先,我应该说明问题是由我犯了一个非常基本的错误引起的。我通过简化问题并按照SO 帖子中概述的步骤找到了解决方案:

我收到的最初错误是:

对象 # 没有方法 'getProperty'

我收到这个是因为 Breeze 无法将我的查询结果映射到实体类型。因此,我的实体没有被 Breeze 包装,因此无法访问“getProperty”函数。

所以,为了解决这个问题,我尽可能地简化了(正如 Ward 在帖子中所建议的那样),在消除了很多复杂性之后,我意识到我的 WebApi 调用没有返回 Breeze 映射我的查询所需的类型信息结果为实体类型(例如,我的 JSON 结果如下):

[
    {
    Id: 1,
    Name: "List 1"
    },
    {
    Id: 2,
    Name: "List 2"
    }
]

当我看到这个时,我意识到我会犯一个非常基本的错误,问题是我的 WebApi 控制器上缺少 [BreezeController] 属性。因此,当我按如下方式更新控制器时:

[BreezeController]
public class DataController : ApiController

JSON 有效负载随后变为:

[
    {
    $id: "1",
    $type: "SJCNet.Todo.Model.TodoList, SJCNet.Todo.Model",
    Id: 1,
    Name: "List 1"
    },
    {
    $id: "2",
    $type: "SJCNet.Todo.Model.TodoList, SJCNet.Todo.Model",
    Id: 2,
    Name: "List 2"
    }
]

然后一切都按预期工作。

所以,简而言之,这是我犯的一个非常基本的错误。但在试图弄清楚这一点时,我学到了很多关于 Breeze 的知识并磨练了我解决问题的能力。这里的主要教训是当我试图解决一个我需要简化的问题时……简化……简化……

于 2013-10-18T23:25:38.890 回答