我在使用 CodeFirst 更新 POCO 的子对象时遇到问题。我的 POCO 如下
public class Place
{
public int ID { get; set;
public string Name { get; set; }
public virtual Address Address { get; set; }
}
public class Address
{
public int ID { get; set;
public string AddressLine { get; set; }
public string City { get; set; }
public virtual State State { get; set; }
}
public class State
{
public int ID { get; set;
public string Name { get; set; }
}
我有一个视图来编辑所有地方及其子字段。除了 State 是 DropDownList 之外,所有属性都是文本框。
当用户单击“保存”按钮时,视图会返回所有已填充的 Place 属性,但仅使用 ID 填充的 State 除外,因为它的值来自 DropDownList 并且 Name 为空。
在编辑发布方法中,我有以下代码:
if (ModelState.IsValid)
{
bool isNewPlace = place.ID == -1;
//Hack, State name is empty from View, we reload
place.Address.State = new StateBLL().GetByID(place.Address.State.ID);
new PlaceBLL().Update(place);
return RedirectToAction("Index");
}
PlaceBLL 类的更新代码如下
protected override void Update(Place place)
{
MyDbContext.Instance().Set<Address>().Attach(place.Address);
MyDbContext.Instance().Entry(place.Address).State = System.Data.EntityState.Modified;
MyDbContext.Instance().Set<State>().Attach(place.Address.State);
MyDbContext.Instance().Entry(place.Address.State) = System.Data.EntityState.Modified;
MyDbContext.Instance().SaveChanges();
}
当用户编辑 Place 对象时,除了状态之外的所有字段都正确更新,当用户更改某个地方的状态时,此更改不会持久保存到数据库,如果代码似乎首先没有检测到用户的状态更改。
你知道为什么 code first 没有检测到 Place 的 State 变化值吗?
谢谢。