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 将在查询时自动挂接您的相关实体,因此您无需创建未映射的属性。
我有一个使用 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 将在查询时自动挂接您的相关实体,因此您无需创建未映射的属性。