EF Core Update связанный объект - PullRequest
       3

EF Core Update связанный объект

0 голосов
/ 14 февраля 2020

Я пытаюсь обновить компанию и ее контактные данные, как в примере JSON запрос с использованием EF Core

PUT https://localhost:6001/api/Company

{
  "CompanyId": 6,
  "Name": "string",
  "ContactDetail": {
    "Name": "string",
    "EmailAddress": "string",
    "Address1": "string",
    "Address2": "string",
    "Address3": "string",
    "PostCode": "string",
    "Telephone": "string"
  }
}

Сгенерированный EF Scaffold выглядит следующим образом

public partial class Company
{
    public long CompanyId { get; set; }
    public string Name { get; set; }
    public virtual ContactDetail ContactDetail { get; set; }
}

public partial class ContactDetail
{
    public ContactDetail()
    {
        Company = new HashSet<Company>();
    }

    public long ContactDetailId { get; set; }
    public string Name { get; set; }
    public string EmailAddress { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string PostCode { get; set; }
    public string Telephone { get; set; }

    public virtual ICollection<Company> Company { get; set; }
}

Как я могу обновить ContactDetail самым чистым способом, если бы я должен был предоставить ContactDetailId, тогда я предполагаю, что все будет работать нормально, но в идеале я хочу предоставить CompanyId родительского объекта. Следующий код обновляет Компанию, но создает новую запись для ContactDetail!?

  public Copmany Update(Copmany company)
  { 
      _bigLoaderContext.Update(company);
      _bigLoaderContext.SaveChanges();

      return GetById(company.CompanyId);
  }

Обновление - решение, которое я сейчас использовал, - получить идентификатор ContactDetail и затем переназначить его объекту.

public Company Update(Company company)
{
    var currentCompany = GetById(companyId, true);

    // Update the contact detail id so that it know what one to update
    company.ContactDetail.ContactDetailId = currentCompany.ContactDetailId;

    _bigLoaderContext.Update(company);
    _bigLoaderContext.SaveChanges();
}

Я получил ошибку при загрузке объекта для получения значения, поэтому пришлось получить его с помощью AsNoTracking в методе GetById.

_bigLoaderContext.Company.AsNoTracking().FirstOrDefault(f => f.CompanyId == companyId);

1 Ответ

0 голосов
/ 14 февраля 2020

Решение, которое я сейчас использовал, - это получить идентификатор ContactDetail, а затем переназначить его объекту.

public Company Update(Company company)
{
    var currentCompany = GetById(companyId, true);

    // Update the contact detail id so that it know what one to update
    company.ContactDetail.ContactDetailId = currentCompany.ContactDetailId;

    _bigLoaderContext.Update(company);
    _bigLoaderContext.SaveChanges();
}

Я получил ошибку при загрузке объекта для получения значения, поэтому пришлось его получить с AsNoTracking в методе GetById.

_bigLoaderContext.Company.AsNoTracking().FirstOrDefault(f => f.CompanyId == companyId);

Предположим, что все в порядке, как это работает!?

...