我有一个使用BreezeJs的JavaScript应用。
当我致电saveChanges
时,实体会转换为javascript并通过网络发送。 (我用小提琴手证实了这一点。)
但是当我在我的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。但不知何故,控制器没有接受它。
我唯一的猜测是我有几个对象,我添加到我的客户端微风实体。但是我已经这样做,因为documentation说你应该,并且它们出现在对象的JSONin小提琴手的__unmapped
部分。
有没有人有任何想法我可以试图找出为什么我的Web Api控制器没有得到JObject?
答案 0 :(得分:1)
请注意,如果您没有在服务器端模型中定义导航属性,只要您具有要使用的外键属性,就可以在客户端元数据中创建导航属性:
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会在查询时自动挂钩您的相关实体,因此您无需创建未映射的属性。
答案 1 :(得分:0)
所以,我的数据库已经过时了,所以我正在处理数据视图。这意味着我不能将外键放入我的数据库级模型中。
实体框架模型也没有任何关联。
因此,我通过向其他实体添加实体和未映射的属性来在客户端手动构建这些关系。 (所以在我上面的例子中,Shipment在实际实体中会有OriginId: int
,但我会添加一个未映射的Origin
属性。但是Origin
本身就是我检索过的实体参考数据。)
原来不支持:https://github.com/Breeze/breeze.js/issues/85
当我更改模型时,我没有实体作为未映射的实体,SaveChanges
正常工作。