如何在 Breeze 中创建具有外键关系的新实体
本文关键字:新实体 关系 实体 Breeze 创建 | 更新日期: 2023-09-27 18:34:50
我有一个使用 Breeze、Web API 和实体框架(代码优先(的 AngularJS SPA。 如何使用对现有实体的外键引用创建新的 Breeze 实体?
我尝试过构建这些示例,但其中一些假设使用Knockout而不是AngularJS。
http://www.breezejs.com/documentation/add-new-entity
http://www.breezejs.com/documentation/creating-entities
我尝试以许多不同的方式添加新的 ScheduleTask 实体,但它们都给出了相同的错误:
遇到的服务器端错误 - 请参阅上的实体错误集合 此对象以获取更多详细信息
"用户"字段为必填字段。
以下是相关的代码片段(客户端上的 TypeScript 和服务器上的 C#(。 我知道我正在做一些顽皮的事情,比如盲目保存更改,但我想让它尽可能简单。
微风配置:
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
控制器方法:
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return this.repository.SaveChanges(saveBundle);
}
父模型:
public class User
{
[Key]
public int UserId { get; set; }
public ICollection<ScheduleTask> ScheduleTasks { get; set; }
}
儿童模型:
public class ScheduleTask
{
[Key]
public int ScheduleTaskId { get; set; }
[Required]
public int UserId { get; set; }
[ForeignKey("UserId"), Required]
public User User { get; set; }
}
尝试 1:
var entity: any = this.manager.createEntity('ScheduleTask');
entity.UserId = 1;
this.manager.saveChanges([entity])
.then(() => {
alert("Success!");
})
.fail((error) => {
alert(error.message + ''n' + error.entityErrors[0].errorMessage);
});
尝试 2:
var entity: any = this.manager.createEntity('ScheduleTask', { UserId: 1 });
this.manager.saveChanges([entity])
.then(() => {
alert("Success!");
})
.fail((error) => {
alert(error.message + ''n' + error.entityErrors[0].errorMessage);
});
尝试 3:
var query = breeze.EntityQuery.from("Users").top(1);
this.manager.executeQuery(query)
.then((users) => {
var user = users.results[0];
var entity: any = this.manager.createEntity('ScheduleTask');
user.ScheduleTasks.push(entity);
this.manager.saveChanges()
.then(() => {
alert("Success!");
})
.fail((error) => {
alert(error.message + ''n' + error.entityErrors[0].errorMessage);
});
})
.fail((error) => {
alert(error.message);
});
尝试 4:
var query = breeze.EntityQuery.from("Users").top(1);
this.manager.executeQuery(query)
.then((users) => {
var user = users.results[0];
var entity: any = this.manager.createEntity('ScheduleTask', { User: user });
this.manager.saveChanges()
.then(() => {
alert("Success!");
})
.fail((error) => {
alert(error.message + ''n' + error.entityErrors[0].errorMessage);
});
})
.fail((error) => {
alert(error.message);
});
哦,太好了。 我花了几个小时试图让它工作,然后我一发布问题就得到了答案。 我只需要删除ScheduleTask.User上的Required属性,它工作正常:
[必填]
public int UserId { get; set; } [外键("用户 ID"(, 必需]
公共用户用户 { get; set; }
由于用户 ID 仍具有"必需"属性,因此 EF 使其不可为空。
我最终在问题中使用了尝试#2,但问题出在服务器端。