I’m wondering what’s the best way to handle default values for relationships when making models. (Specifically EF4)
For example, my Organization has a default Contact and I was wondering which one was the best approach. I got these two options (or any other anyone suggests if better)
Using Relationship:
public class Contact
{
public int Id { get; set; }
public string FirstName { get; set; }
}
public class Organization
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Contact> Contacts { get; set; }
//Use a relationship for the default contact?
public Contact DefaultContact { get; set; }
}
Using Value:
public class Contact
{
public int Id { get; set; }
public string FirstName { get; set; }
//Use value?
public boolean IsDefault { get; set; }
}
public class Organization
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Contact> Contacts { get; set; }
}
I’d go with Option 1. While 2 is definitely easier to implement, it doesn’t enforce rules such as “There cannot be 2 default contacts”. I end up with something like the following:
There’s a limitation of this approach – it doesn’t work nested deletes (see this question for more details). Because of this, you need to disable CascadeOnDelete for the 1-to-many relationship:
(Code done without testing, but should work)
The other problem with this is that it’s not possible to add the Default Contact at the same time as you’re adding the organization, as EF can’t figure out the correct order of statements. You need to call .SaveChanges between each. You can still use a TransactionScope to overcome this, but it’s not clean: