Our database has three entities: Person
, Company
and PhoneCall
.
Person
describes an individual. Company
describes a company. PhoneCall
describes the details of a phone call to either a Person
or Company
.
public class Person
{
public int Id { get; set;}
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}
public class Company
{
public int Id { get; set;}
public string Name { get; set; }
public string VatNumber { get; set; }
}
public class PhoneCall
{
public int Id { get; set;}
public string Description { get; set;}
public int Duration { get; set;}
public int? PersonId { get; set; }
public Person Person { get; set; }
public int? CompanyId { get; set; }
public Company Company { get; set; }
}
I am seeing certain undesirable behavior with Entity Framework when deleting a Person
or Company
.
If I delete a Person
, entity framework is updating any associated PhoneCall
entries and setting PersonId
to NULL.
dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();
Instead of Entity Framework setting PersonId
to null on all of the associated PhoneCall
entries, what I would like is for entity framework throw some kind exception to let me know that the Person
cannot be deleted because there are related entities referencing said Person
.
The problem seems to be that entity framework doesn't respect the PhoneCall.PersonId
and PhoneCall.CompanyId
foreign keys since they are both (necessarily) nullable.
I can obviously perform my own check before deletion like so:
if (phoneCallDbSet.Where(ph => ph.Person == personToDelete).Any())
throw new InvalidOperationException("Cannot delete person with associated calls");
...but my preference would be to set up a some kind of restriction that prevents Entity Framework from setting the foreign key to NULL in the first place, so that if a developer forgets to perform this check, we don't end up with entries in the PhoneCall
table linking to nothing.
Is this possible?