Angular / Breeze:如何首先在Entity Framework代码中定义零对多关系?

时间:2014-03-26 20:28:45

标签: entity-framework angularjs breeze

我正在开发一个首先使用EF代码的角度/微风Web应用程序,并遇到一个奇怪的问题。以下是代码段:

public class Person
{
    public int Id { get; set; }
    public int? AddressId { get; set; }
    public virtual Address Address { get; set; }
}
public class Address
{
    public int Id { get; set; }     
    public virtual ICollection<Person> Persons { get; set; }
}

// DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>().HasOptional(x => x.Address).WithMany(x => x.Persons).WillCascadeOnDelete(false);      
    base.OnModelCreating(modelBuilder);
}

除了一种情况外,一切都运行良好:您可以在不指定地址的情况下创建人员,但是,一旦为该人选择了地址,您就可以更改为另一个人,但是您无法将其删除。

这是我在Angular select中删除它的方法:

<option value=""></option>

这是我在尝试重置地址时遇到的错误:

{"The UPDATE statement conflicted with the FOREIGN KEY constraint \"FK_dbo.Person_dbo.Address_AddressId\". The conflict occurred in database \"MyDb\", table \"dbo.Address\", column 'Id'.\r\nThe statement has been terminated."}

那么,出了什么问题?

更新: 正如我所知,问题似乎是在客户端。选择空选项时,它将AddressId设置为0,而不是NULL。如果我在调试模式下将其更改为NULL,它将起作用。这是完整的选择代码:

<select ng-model="person.address" ng-options="g.name for g in addressList"><option value=""></option></select>

现在,问题是如果选择空地址,如何将其id返回为NULL而不是0?

1 个答案:

答案 0 :(得分:1)

你可以设置一个plunker吗?

在我看来,Person.addressId应该在元数据中被标记为可为空(你可以确认吗?)因此Breeze应该将addressId设置为null(而不是0当你使Person.address为空时。

我感觉这可能是涉及您的组合框绑定选项<option value=""></option>的Angular问题。我不确定在与ng-options="g.name for g in addressList"结合使用时,您的行为是否正常。

您可以考虑放置一个&#34;按钮&#34; (&#39; x&#39; for&#34; clear&#34;)在组合框旁边,点击后设置Person.address = nullPerson.addressId = null