EF 6.0 - Обновление отношений с EntityState.Modified - PullRequest
0 голосов
/ 09 июля 2019

В приложении 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

[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)

Даже если он является частью объекта клиента.

1 Ответ

2 голосов
/ 09 июля 2019

Добавить ResellerId к модели клиента

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 Guid ResellerId { get; set; }
    [ForeignKey("ResellerId")]
    public Reseller Reseller { get; set; }  
}

затем измените ResellerId

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...