我有两个实体Customer
和User
,如下所示:
public class User
{
[Key]
public int Id { get; set; }
[StringLength(20)]
public string CustomerId { get; set; }
public string Password { get; set; }
public bool Locked { get; set; }
[ForeignKey("CustomerId")]
public virtual Customer Customer { get; set; }
}
public class Customer
{
[Key]
[Column("Id", TypeName = "nvarchar")]
[StringLength(20)]
public string Id { get; set; } // nvarchar(20)
[Required]
public string GivenName { get; set; } // nvarchar(100)
[Required]
public string Surname { get; set; } // nvarchar(100)
public virtual ICollection<User> Users { get; set; }
}
我有一个简单的强类型视图用于编辑客户,我想在视图中添加一个带有以下逻辑的复选框 - 当该客户至少有一个用户时,应该选中复选框。第一个用户的Locked
属性设置为false
。我无法找到实现这一目标的方法。在MVC中执行此操作的正确方法是什么?以及处理方法([HttpPost]Edit
)如何接收此复选框的值,目前它只是获取Customer
对象?我应该为此视图创建其他模型吗?还是有另一种方式?
预计这个问题我应该说我要注意的是,客户不会只有一个用户。
我为客户添加了一个视图模型,并更新了编辑视图和控制器以使用此模型:
public class CustomerViewModel
{
public Model.Data.Customer BaseCustomer { get; set; }
public bool HasActiveUser { get; set; }
}
我的编辑保存方法现在看起来像这样:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ViewModel.Data.Customer customer)
{
if (ModelState.IsValid)
{
//db.Entry(customer.BaseCustomer).Collection("Users").Load();
db.Entry(customer.BaseCustomer).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.CustomerTypeId = new SelectList(db.CustomerTypes, "Id", "Name", customer.BaseCustomer.CustomerTypeId);
return View(customer);
}
唯一的问题仍然是我如何访问Users
导航属性为null,我尝试重新加载它,但得到InvalidOperationException
,错误显示为Member 'Load' cannot be called for property 'Users' because the entity of type 'Customer' does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<Customer>.
我'我还试图通过Customer baseCustomer = db.Customers.Find(customer.Id);
再次让客户回复,但我无法设置db.Entry(customer.BaseCustomer).State = EntityState.Modified;
,因为它告诉我An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
有任何想法吗?
答案 0 :(得分:0)
我决定创建一个专用的视图模型,它将包含域模型对象(如第二个模式ASP.NET MVC View Model Patterns by Steve Michelotti所示)和一个用于绑定到我的复选框的附加属性。然后在控制器中我处理所有关于何时显示所选复选框的逻辑,以及何时创建新用户(如果不存在)。我遇到了几个问题,所以我想发布我的解决方案,也许它们远非最佳实践,但我认为它们可能对初学者有用,我当然希望看到评论或其他解决方案。
User
属性,该属性将成为User
导航集Users
属性中第一个Customer
的访问者(当我添加它时,它不能访问Users
,因为这个属性在回发后为空,因为我知道这是因为重新创建的Customer
与上下文分离。)Customer
将重新创建的(通过EF,如前所述)db.Entry(customer.BaseCustomer).State = EntityState.Modified;
对象附加到上下文(感谢Using DbContext in EF 4.1 Part 4: Add/Attach and Entity States § Attaching an existing but modified entity to the context )并通过调用db.Entry(customer.BaseCustomer).Collection("Users").Load();