Я пытаюсь обновить компанию и ее контактные данные, как в примере 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);