Por que devo ter um construtor sem parâmetros para o Code First / Entity Framework
Essa é mais uma questão de "Por que fazemos as coisas", pois meu problema real foi resolvido, mas não sei por quê.
Eu estava lidando com o seguinte código dentro do meu 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();
}
}
O AppDbContext que criei acima iria para um inicializador personalizado:
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();
}
}
O problema era que, quando eu executava o código, o AppDbContext carregava as informações do estado e do município corretamente no inicializador, mas quando voltava ao repositório do condado, o AppDbContext estava vazio e apresentava erro devido a "O estado não tem construtor sem parâmetros". Como eu não queria que meu objeto State tivesse um construtor sem parâmetros, procurei o dia inteiro uma solução para o motivo pelo qual o AppDbContext carregaria no Repositório do Condado. Finalmente encontrei a seguinte solução:
Exceção ao carregar objetos relacionados. Estrutura de entidade
Foi uma solução simples. Adicione o construtor sem parâmetros e marque-o como Obsoleto. Eu fiz isso e funcionou perfeitamente.
Minha pergunta é: POR QUE devo fazer isso? Eu passei por vários exemplos de CodeFirst usando o Inicializador personalizado e nenhum deles mencionou a necessidade de um construtor vazio ou a marcação de Obsoleto.
Existe uma solução melhor ou pelo menos uma explicação para que eu possa avançar com conhecimento em vez de confusão?