16

コード ファースト マイグレーションを使用しようとすると、このエラーが発生します。

私のコンテキストには、接続名を持つコンストラクターがあります。

public class VeraContext : DbContext, IDbContext
{
    public VeraContext(string NameOrConnectionStringName = "VeraDB")
        : base(NameOrConnectionStringName)
    {
    }

    public IDbSet<User> Users { get; set; }
    public IDbSet<Product> Products { get; set; }
    public IDbSet<IntCat> IntCats { get; set; }
}

この接続名は、プロジェクトの実行時に ninject で挿入されます。上記のコードのようにデフォルトとして指定しましたが、これは役に立ちませんでした。

kernel.Bind<IDbContext>()
    .To<VeraContext>()
    .WithConstructorArgument("NameOrConnectionStringName", "VeraDB");

「Enable-Migrations」で移行を追加しようとすると、次のエラーがスローされます。

ターゲット コンテキスト 'VeraData.EF.Infrastructure.VeraContext' は構築できません。既定のコンストラクターを追加するか、IDbContextFactory の実装を提供します。

コンストラクターを削除するVeraContextと機能しますが、名前として別のデータベースを作成しますVeraData.EF.Infrastructure.VeraContext

ninjectコードの最初の移行を使用するときではなく、プロジェクトの実行時にのみ接続文字列を渡すと思います。とにかく、コードの最初の移行を使用するときに、接続名のデフォルトを挿入/提供できますか?

4

4 に答える 4

20

基本的に、デフォルトのctorが必要です(これはエラーです)-しかし、それを実装するだけでは問題が発生します。

結果の一貫性を保つには、 を実装するIDbContextFactory必要があります (そうしないと、コードからの移行が機能しなくなります)。

移行では、実際に既定のコンストラクターを呼び出して接続を確立します。だからあなたが他人ctorであることはあまり重要ではありません。

これが基本的な工場です...

public class MyContextFactory : IDbContextFactory<MyContext>
{
    public MyContext Create()
    {
        return new MyDBContext("YourConnectionName");
    }
}

それを注入と組み合わせて、必要に応じて DbContext を注入して構築する必要があります。

于 2013-04-12T17:14:45.927 に答える
2

@ nccsbim071の回答を補完するために、もう1つ追加する必要があります...このオプションは、デフォルトパラメーターを持つコンストラクターが好きではありません...たとえば:

public MyContext(bool paramABC = false) : base("name=Entities") {...}

代わりに、非パラメーター (デフォルト) コンストラクターとパラメーター コンストラクターを昔ながらの方法で作成する必要があります。

public MyContext() :base("name=Entities") {...} 
public MyContext(bool paramABC) : this() {...}

ノート:

  • Entitiesこの場合、接続文字列名を意味します... 慣例により、コンテキストの名前は接続文字列名とMyContext同じであり、 と同じではないため、Entities手動で指定する必要があります。
于 2014-02-05T15:47:06.693 に答える