In base alla risposta accettata qui: la relazione non può essere modificata perché una o più proprietà della chiave esterna non sono annullabili
Ho già eliminato tutti gli elementi figlio prima di aggiornare l'entità utilizzando entity.Children.Clear()
:
public static JsonViewData AddOrUpdate(ModelDBContext context, GENCompanyViewModel companyModel, string userName, string userId)
{
try
{
var company = new GENCompany();
if (companyModel.Id > 0) //Update
{
company = context.Companies.Find(companyModel.Id);
context.Entry(company).State = EntityState.Modified;
company.Vehicles.Clear();
company.Phones.Clear();
company.Emails.Clear();
company.InjectFrom(companyModel);
company.DateUpdated = DateTime.Now;
}
else //Add
{
company.InjectFrom(companyModel);
company.CreatedById = new Guid(userId);
context.Companies.Add(company);
context.SaveChanges(userName);
}
if (companyModel.Vehicles.Any())
{
foreach (var vehicleModel in companyModel.Vehicles)
{
var vehicle = context.Vehicles.Find(vehicleModel.Id);
context.Entry(vehicle).State = EntityState.Unchanged;
company.Vehicles.Add(vehicle);
}
}
if (companyModel.Phones.Any())
{
foreach (var phoneModel in companyModel.Phones)
{
var phone = new GENCompanyPhone();
phone.InjectFrom(phoneModel);
company.Phones.Add(phone);
}
}
if (companyModel.Emails.Any())
{
foreach (var emailModel in companyModel.Emails)
{
var email = new GENCompanyEmail();
email.InjectFrom(emailModel);
company.Emails.Add(email);
}
}
context.SaveChanges(userName);
return new JsonViewData { IsSuccess = true, Message = "Added Successfully" };
}
catch (Exception ex)
{
return new JsonViewData { IsSuccess = false, Message = ex.InnerException?.InnerException?.Message ?? ex.InnerException?.Message ?? ex.Message };
}
}
e ottengo questo errore:
L'operazione non è riuscita: la relazione non può essere modificata perché una o più proprietà della chiave esterna non sono annullabili. Quando viene apportata una modifica a una relazione, la relativa proprietà della chiave esterna viene impostata su un valore nullo. Se la chiave esterna non supporta valori nulli, deve essere definita una nuova relazione, la proprietà chiave esterna deve essere assegnata a un altro valore non nullo o l'oggetto non correlato deve essere eliminato.
Il problema si verifica perché si sta tentando di rimuovere qualcosa da un'estremità di una relazione ma non dall'altra e la cosa dall'altra parte non è annullabile.
La soluzione più semplice è quella di abilitare le eliminazioni a cascata, quindi lasciare che EF si preoccupi dei dettagli, ma se si deve gestire questo, allora è necessario rimuovere tutti gli elementi usando come si è, ma anche su ciascun elemento impostare l'elemento correlato su null e se questo non può essere nullo dovrai rimuovere anche l'oggetto correlato.