2013-10-09 72 views
1

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

我试图建立这些例子,但其中一些假设使用Knockout而不是AngularJS。

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

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

我已尝试添加一个新的ScheduleTask实体许多不同的方式,但他们都给予了同样的错误:

Server side errors encountered - see the entityErrors collection on this object for more detail

The User field is required.

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

回答

1

噢,极大。我花了几个小时试图让这个工作,然后答案在我发布这个问题后立即找到了我。我不得不摆脱对ScheduleTask.User必选属性,它工作正常:

[Required]
public int UserId { get; set; }
[ForeignKey("UserId"), Required]
public User User { get; set; }

由于用户ID仍具有所需的属性,EF使得它不能为空。

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

+0

老兄!这种尝试是为了避免这种情况。 – hidden

+0

@jvelez:我结束了尝试#2,但我想他们都会工作。问题出在服务器端代码,而不是客户端。我将这添加到我的答案中。 –