您可以在http://code.google.com/p/contactsctp5/找到演示此问题的源代码。
我有三个模型对象。联系人,联系信息和联系信息类型。每个联系人有多个联系信息,每个联系信息都是一种联系信息类型。我猜这很简单。但是,当我尝试编辑联系人对象时,我遇到了一个问题。我从联系人存储库中拉出它。然后我运行“UpdateModel(contact);”,它使用表单中的所有值更新对象。 (使用调试监控)。但是,当我保存更改时,我会得到以下错误:
操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性设置为 null 值。如果外键不支持空值,则必须定义新的关系,将外键属性分配给另一个非空值,或删除不相关的对象。
看起来像是在我调用 update model 后,它将我的引用设为 null,这似乎破坏了一切?对于如何解决此问题,您有何想法?谢谢。
以下是我的模型:
我有三个模型对象。联系人,联系信息和联系信息类型。每个联系人有多个联系信息,每个联系信息都是一种联系信息类型。我猜这很简单。但是,当我尝试编辑联系人对象时,我遇到了一个问题。我从联系人存储库中拉出它。然后我运行“UpdateModel(contact);”,它使用表单中的所有值更新对象。 (使用调试监控)。但是,当我保存更改时,我会得到以下错误:
操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性设置为 null 值。如果外键不支持空值,则必须定义新的关系,将外键属性分配给另一个非空值,或删除不相关的对象。
看起来像是在我调用 update model 后,它将我的引用设为 null,这似乎破坏了一切?对于如何解决此问题,您有何想法?谢谢。
以下是我的模型:
public partial class Contact {
public Contact() {
this.ContactInformation = new HashSet<ContactInformation>();
}
public int ContactId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<ContactInformation> ContactInformation { get; set; }
}
public partial class ContactInformation {
public int ContactInformationId { get; set; }
public int ContactId { get; set; }
public int ContactInfoTypeId { get; set; }
public string Information { get; set; }
public virtual Contact Contact { get; set; }
public virtual ContactInfoType ContactInfoType { get; set; }
}
public partial class ContactInfoType {
public ContactInfoType() {
this.ContactInformation = new HashSet<ContactInformation>();
}
public int ContactInfoTypeId { get; set; }
public string Type { get; set; }
public virtual ICollection<ContactInformation> ContactInformation { get; set; }
}
我的控制器操作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact person) {
if (this.ModelState.IsValid) {
var contact = this.contactRepository.GetById(person.ContactId);
UpdateModel(contact);
this.contactRepository.Save();
TempData["message"] = "Contact Saved.";
return PartialView("Details", contact);
} else {
return PartialView(person);
}
}
上下文代码:
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
modelBuilder.Entity<Contact>()
.HasMany(c => c.ContactInformation)
.WithRequired()
.HasForeignKey(c => c.ContactId);
modelBuilder.Entity<ContactInfoType>()
.HasMany(c => c.ContactInformation)
.WithRequired()
.HasForeignKey(c => c.ContactInfoTypeId);
}