Como atualizar o FK para nulo ao excluir a entidade relacionada opcional
Sou razoavelmente novo na EF e estou lutando um pouco para facilitar a exclusão de meus objetos. Meus dois objetos e o DbContext associado têm a seguinte aparência:
public class Context: DbContext
{
public Context() : base(){}
public DbSet<Person> Persons {get;set;}
public DbSet<Vehicle> Vehicles {get;set;}
}
public class Person
{
public int PersonID {get;set;}
public string Name {get;set;}
}
public class Vehicle
{
public int VehicleID {get;set;}
public int? PersonID {get;set;}
[ForeignKey("PersonID")]
public virtual Person Person {get;set;}
}
Conforme mencionado acima, uma pessoa pode ser vinculada a vários veículos. Não existe um link explícito da pessoa para o veículo, mas existe um link do veículo para uma pessoa 'pai' através do relacionamento de chave estrangeira.
Em seguida, crio vários veículos no meu código e os vinculo aopcional objetos de pessoa (chave estrangeira é anulável).
Minha pergunta é sobre a exclusão de objetos Pessoa. Eu costumo excluir os objetos da seguinte maneira:
private void DeletePerson()
{
using (var context = new Context())
{
int personID = 4; //Determined through other code
var person = context.Persons.Find(personID);
context.Persons.Remove(person);
context.SaveChanges();
}
}
No entanto, o código acima falharia, fornecendo uma exceção de restrição de referência (devido à chave estrangeira do veículo). No entanto, eu esperaria que a chave estrangeira de todos os veículos vinculados à pessoa específica fosse simplesmente definida como nula?
Consegui que o código funcionasse carregando explicitamente todos os veículos relevantes para o contexto da seguinte maneira:
private void DeletePerson()
{
using (var context = new Context())
{
//Determined through other code
int personID = 4;
// Single vehicle associated with this person, there can be multiple vehicles
int vehicleID = 6;
var person = context.Persons.Find(personID);
// Seems to force loading of the vehicle, facilitating setting
// its "PersonID" property to null
var vehicle = context.Vehicles.Find(vehicleID);
context.Persons.Remove(person);
context.SaveChanges();
}
}
O problema com o código acima, no entanto, é que eu preciso criar um objeto List dentro da minha classe Person que contenha uma referência (ou ID) para todos os objetos dependentes em potencial (veículos é apenas um exemplo aqui, haverá várias outras classes semelhantes com relações semelhantes a Pessoa).
A criação desta lista no objeto Pessoa é a única maneira de fazer isso? E existe alguma maneira de automatizar a criação desta lista / automatizar a adição dos dependentes? Eu preferiria não ter que gerenciar explicitamente esses relacionamentos por meio de um objeto de lista na minha classe Person.
Obrigado!