【问题标题】:How do I create a new entity in Breeze with a foreign key relationship?如何在 Breeze 中创建具有外键关系的新实体?
【发布时间】:2013-10-17 08:23:11
【问题描述】:

我有一个使用 Breeze、Web API 和实体框架(代码优先)的 AngularJS SPA。如何使用对现有实体的外键引用创建新的 Breeze 实体?

我已经尝试构建这些示例,但其中一些假设使用 Knockout 而不是 AngularJS。

http://www.breezejs.com/documentation/add-new-entity

http://www.breezejs.com/documentation/creating-entities

我尝试了很多不同的方法来添加一个新的 ScheduleTask 实体,但它们都给出了相同的错误:

遇到服务器端错误 - 请参阅 entityErrors 集合 这个对象的更多细节

用户字段是必需的。

以下是相关的代码片段(客户端上的 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);
    });

【问题讨论】:

    标签: c# entity-framework angularjs typescript breeze


    【解决方案1】:

    哦,太好了。我花了几个小时试图让它发挥作用,然后我一发布问题就得到了答案。我只需要去掉 ScheduleTask.User 上的 Required 属性,它就可以正常工作:

    [必填]
    公共 int 用户 ID { 获取;放; }
    [ForeignKey("UserId"), 必填]
    公共用户用户{获取;放; }

    由于 UserId 仍然具有Required 属性,EF 使其不可为空。

    我最终在问题中使用了第 2 次尝试,但问题出在服务器端。

    【讨论】:

    • @jvelez:我最终使用了尝试 #2,但我想它们都会起作用。问题出在服务器端代码中,而不是客户端。我将此添加到我的答案中。
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多