Pourquoi dois-je avoir un constructeur sans paramètre pour le Premier Code / Entity Framework

C'est plus une question de "Pourquoi nous faisons les choses" que mon problème a été résolu mais je ne sais pas pourquoi.

J'avais à faire avec le code suivant à l'intérieur de mon 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();
        }
    }

La AppDbContext j'ai créé ci-dessus serait aller un Initialiseur:

  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();
    }
}

Le problème est que, quand j'ai exécuté le code de la AppDbContext charge de l'État et du Comté correctement les informations dans l'Initialiseur, mais quand il est revenu dans le Comté de Référentiel, le AppDbContext était vide et serait d'erreur en raison de "l'État n'a pas de constructeur sans paramètre". Je ne voulais pas que mon État d'objet à avoir un constructeur sans paramètre alors, j'ai cherché toute la journée pour une solution à pourquoi la AppDbContext woulding charge dans le Comté de Référentiel. J'ai enfin trouvé la solution suivante:

Exception lors du chargement d'objets liés. Entity Framework

C'était une solution simple. Ajouter le constructeur sans paramètre et la marque qu'il est Obsolète. Je l'ai fait et cela a fonctionné parfaitement.

Ma question est, POURQUOI dois-je faire? Je suis allé à travers de multiples exemples de CodeFirst à l'aide personnalisée d'Initialiseur et aucun nécessitant un constructeur vide ou le marquage Obsolète.

Est-il une meilleure solution ou au moins une explication pour que je puisse aller de l'avant avec la connaissance au lieu de la confusion?

  • si votre état de classe a un constructeur personnalisé, vous devez également fournir un autre constructeur (qui ne prend pas de paramètres). pourquoi? règles de .net.
  • Eh bien, ce n'est pas tout à fait correct. Si vous ne disposez pas d'un constructeur est défini, les implicites de constructeur par défaut (sans paramètre) existe. Si vous spécifiez un constructeur, et que vous voulez utiliser à la fois paramétré et sans paramètre, alors vous devez le spécifier explicitement.
InformationsquelleAutor Travis B | 2015-07-21