web-dev-qa-db-ja.com

Code First / Entity Frameworkのパラメーターなしのコンストラクターが必要な理由

私の実際の問題は解決されましたが、なぜなのか分かりません。

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

上記で作成したAppDbContextは、カスタム初期化子に移動します。

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

問題は、AppDbContextが州と郡の情報をイニシャライザに正しくロードするコードを実行したときに、郡リポジトリに戻ったときにAppDbContextが空であり、「状態にパラメータのないコンストラクタがないため」エラーが発生することでした。 Stateオブジェクトにパラメーターのないコンストラクターを持たせたくなかったので、AppDbContextが郡リポジトリに読み込まれる理由の解決策を一日中探しました。私は最終的に次の解決策を見つけました:

関連オブジェクトのロード時の例外。EntityFramework

それは簡単な解決策でした。パラメーターなしのコンストラクターを追加し、廃止とマークします。私はこれを行い、それは完全に機能しました。

私の質問は、なぜこれをしなければならないのですか?カスタム初期化子を使用して、CodeFirstの複数の例を調べましたが、空のコンストラクターを必要とする、またはそれをObsoleteとマークする例はありませんでした。

混乱の代わりに知識を進めることができるように、より良い解決策または少なくとも説明はありますか?

17
Travis B

パラメータのないコンストラクタが必要ですが、内部またはプライベートにすることができます。 質問3を参照

30
Nair