BreezeController 未获取 JObject(它为空)

BreezeController does not get the JObject (it is null)

我有一个使用 BreezeJs 的 javascript 应用程序。

当我调用 saveChanges 时,实体被转换为 javascript 并通过网络发送。 (我用 fiddler 确认了这一点。)

但是当我在 Web Api 控制器中放置断点时,SaveChanges 的 JObject 为空。

我似乎不明白为什么。

这是我的控制器设置方式的示例:

[BreezeController]
public class ShipmentController : ApiController
{
    [HttpGet]
    public string Metadata()
    {
        return dataAccess.Metadata();
    }
    [HttpGet]
    public IQueryable<Shipment> Shipments()
    {
        return dataAccess.Shipments();
    }


    //   This is what is NULL each time --------+
                                                |
                                                |
    [HttpPost]                                  V
    public SaveResult SaveChanges(JObject saveJObject)
    {
        return dataAccess.SaveChanges(saveJObject);
    }

    //... Other stuff to get data
}

我通过控制器获取数据的查询工作正常。所以这不是一个完全失败的场景。

正如我上面所说,Fiddler 显示有效 JSON 通过网络。但不知何故控制器没有接受它。

我唯一的猜测是我有几个对象添加到我的客户端 breeze 实体中。但我已经按照 documentation 所说的那样做了,它们出现在对象 JSONin fiddler 的 __unmapped 部分中。

有没有人有任何想法我可以尝试弄清楚为什么我的 Web Api 控制器没有获取 JObject?

所以,我的数据库很旧,所以我正在处理数据视图。这意味着我不能将外键放入我的数据库级模型中。

Entity Framework模型也没有任何关联。

因此,我通过向其他实体添加实体和未映射的属性,在客户端手动构建这些关系。 (所以在我上面的示例中,Shipment 在实际实体中会有一个 OriginId: int,但我会添加一个 Origin 的未映射 属性。但是 Origin 本身就是一个实体我已经检索作为参考数据。)

原来不支持:https://github.com/Breeze/breeze.js/issues/85

当我更改我的模型时,我没有实体作为未映射的实体并且 SaveChanges 工作正常。

请注意,如果您没有在服务器端模型中定义导航属性,则可以在客户端元数据中创建导航属性,只要您具有要使用的外键属性即可:

    var childEntityType = metadataStore.getEntityType("MyChildEntity");
    childEntityType.addProperty(new breeze.NavigationProperty({
        name: "myParent",
        entityTypeName: "MyParentEntity:#My.Namespace",
        isScalar: true,
        associationName: "MyChildEntity_MyParentEntity",
        foreignKeyNames: ["myParentId"]
    }));

您应该在从服务器检索元数据之后、创建任何实体或执行任何查询之前立即添加这些关系。

    entityManager.fetchMetadata().then(function () {
        patchMetadata(entityManager.metadataStore); // add missing navigations
    });

添加导航 属性 后,Breeze 将在查询时自动挂接您的相关实体,因此您无需创建未映射的属性。