Travis B
Travis B

Reputation: 433

Why must I have a parameterless constructor for Code First / Entity Framework

This is more of a question of "Why we do things" as my actual problem was solved but I don't know why.

I was dealing with the following code inside my CountyRepository:

public IEnumerable<County> GetCounties(string stateAbbr)
    {
        using (var db = new AppDbContext())
        {
            State state = (from s in db.States
                         where s.Abbr == stateAbbr
                         select s).First();

            return context.Counties.Where(c => c.StateID == state.StateID).ToList();
        }
    }

The AppDbContext I created above would go to a custom Initializer:

  public class AppDbContextInitializer : DropCreateDatabaseIfModelChanges<AppDbContext> 
{
    protected override void Seed(AppDbContext context)
    {
        StatesList states = new StatesList();
        context.States.AddRange(states);
        context.Counties.AddRange(new CountiesList(states));

        context.SaveChanges();
    }
}

The problem was, when I executed the code the AppDbContext would load the State and County information correctly in the Initializer, but when it came back into the County Repository, the AppDbContext was empty and would error due to "State has no parameterless constructor". I didn't want my State object to have a parameterless constructor so I looked all day for a solution to why the AppDbContext woulding load in the County Repository. I finally found the following solution:

Exception when loading related objects. Entity Framework

It was a simple solution. Add the parameterless constructor and mark it Obsolete. I did this and it worked perfectly.

My question is, WHY must I do this? I went through multiple examples of CodeFirst using custom Initializer and none of them mentioned requiring an empty constructor or marking it Obsolete.

Is there a better solution or at least an explanation so I can go forward with knowledge instead of confusion?

Upvotes: 33

Views: 25181

Answers (1)

S.N
S.N

Reputation: 5140

There must be a parameterless constructor, but it can be internal or private. ref question 3

Upvotes: 49

Related Questions