В приложении 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
), обновляются все столбцы, кроме идентификатора компании торгового посредника.Насколько я понимаю, Modified
помечает все поля как грязные и обновляет их все, но здесь этого не происходит.
Ниже приведено действие контроллера для обновления Клиента.Я проверил, и во входящей модели правильно задан правильный CompanyID реселлера:
![VS Debugger showing the ID set correctly that should be updated in the Database](https://i.stack.imgur.com/nJnuK.png)
[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генерироваться.Обратите внимание, что ID компании реселлера не включен в запрос:
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)
Даже если он является частью объекта клиента.