I have a set of four POCO objects that need to reference themselves in this way:
A Freelancer can have multiple Clients
Clients can have multiple Projects
Projects can have multiple Stories.
One this I want to make sure is possible is that a freelancer starts off with no clients, and client starts off with no projects, and a project starts off with no stories, so I guess they need to be nullable?
The opposite is true the other direction, a story NEEDS a project, project needs a client, and a client needs a freelancer.
I just want to see if there is anything that I need to do when I am creating the model (onModelCreating override) to make sure this is the relationship that happens.
Here are my objects:
public class Freelancer
{
public int ID { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string CompanyName { get; set; }
public string Avatar { get; set; }
public Address FreelancerAddress { get; set; }
public ICollection<Client> Clients { get; set; }
}
public class Client
{
public int ID { get; set; }
public string Name { get; set; }
public Address ClientAddress { get; set; }
public string Logo { get; set; }
public ICollection<Project> Projects { get; set; }
}
public class Project
{
public int ID { get; set; }
public string Name { get; set; }
public string Summary { get; set; }
public string Description { get; set; }
public ICollection<Story> Stories { get; set; }
}
public class Story
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public decimal Duration { get; set; }
public bool Billable { get; set; }
public string Notes { get; set; }
}
I understand EF does some things automatically, I am just asking if there is more I need to do to make sure I have the relationship I want. Thanks
By convention your model will create optional relationships (“client can have a freelancer but doesn’t need to”) but since you want required relationships (“client needs a freelancer”) you must define it with Fluent API:
You can work without the last line (
Map). EF will then create a default foreign key name, something with underscore, maybeFreelancer_ID.And the same mapping for the other relationships.
Alternatively you can introduce inverse navigation properties with foreign key properties:
With such a model EF will recognize the relationships as required automatically because the foreign key property
FreelancerIDis not nullable and you don’t need additional mapping with Fluent API.