【发布时间】:2019-11-19 06:47:47
【问题描述】:
在具有以下(简化)模型的 ASP.NET MVC5 应用程序中:
public class Customer
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid CustomerID { get; set; }
public string Name { get; set; }
public string PrimaryContact { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public Reseller Reseller { get; set; }
}
public class Reseller
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid CompanyId { get; set; }
public ICollection<Customer> Customers { get; set; }
}
我希望能够更新与客户关联的经销商。当尝试通过将客户实体标记为已修改 (ctx.Entry(customer).State = EntityState.Modified) 来更新客户实体时,除了经销商的 CompanyID 之外的所有列都会更新。据我了解,Modified 将所有字段标记为脏并更新所有字段,但这里不会发生这种情况。
以下是用于更新客户的控制器操作。我已检查并在传入模型中正确设置了经销商的正确 CompanyID:
[HttpPost]
public ActionResult Edit(Customer customer)
{
if (ModelState.IsValid)
{
using (var ctx = new DbContext())
{
ctx.Entry(customer).State = EntityState.Modified;
ctx.SaveChanges();
return RedirectToAction("Info", new { id = customer.CustomerID });
}
}
return View(customer);
}
调用 SaveChanges 时,会生成以下 SQL。请注意,Reseller CompanyID 不包含在查询中:
UPDATE [dbo].[Customer]
SET [Name] = @0, [PrimaryContact] = @1, [Email] = @2, [PhoneNumber] = @3
WHERE ([CustomerID] = @4)
-- @0: 'Sample Customer iuhiuhi' (Type = String, Size = -1)
-- @1: 'Joe Bloggs' (Type = String, Size = -1)
-- @2: 'example@example.com' (Type = String, Size = -1)
-- @3: '123456789' (Type = String, Size = -1)
-- @4: 'e4b9e8d3-9f92-e811-baa4-3052cb3d0eb2' (Type = Guid)
即使它是客户实体的一部分。
【问题讨论】:
-
CompanyID是主键,所以你不能更新它。 -
我不想更改
CompanyID- 我想更新客户以拥有不同的CompanyID -
将状态设置为已修改仅影响标量属性,而不影响导航属性。
标签: c# entity-framework asp.net-mvc-5