2

DbContextEF コードを使用する まず、クラス名をデータベースの接続文字列name属性と一致させて連携させる必要があることがわかりました。ただし、次のコードは機能しません。

 public class UserDbContext : DbContext
         {
             public DbSet<Users> Users { get; set; }
         }

この接続文字列とともに:

<add name="UserDbContext" 
 connectionString="Data Source=(LocalDB)\v11.0;
 AttachDbFilename=|DataDirectory|\Users.mdf;
 Integrated Security=True" 
 providerName="System.Data.SqlClient" />

しかし、代わりに、DbContext名前とともにモデルを直接指すこの接続文字列を使用する必要があります

<add name="NextFlicksMVC4.Models.userAccount.Users+UserDbContext"     
 connectionString="Data Source=(LocalDB)\v11.0;
 AttachDbFilename=|DataDirectory|\Users.mdf;
 Integrated Security=True"
 providerName="System.Data.SqlClient" />

意図したとおりに動作し、App_Data フォルダーの LocalDB に接続します。

DbContext クラスのフルパスを指定した場合にのみ機能する理由を誰かに説明できますか?

4

2 に答える 2

3

このように UserDbContext クラスでコンストラクターを指定すると、問題が解決します

        public UserDbContext() : base("UserDbContext") {}
于 2013-04-18T13:52:14.617 に答える
2

ドキュメントからのデフォルトのコンストラクタ:

規則を使用して新しいコンテキストインスタンスを構築し、接続が確立されるデータベースの名前を作成します。慣例により、名前は派生コンテキストクラスのフルネーム(名前空間+クラス名)です。これを使用して接続を作成する方法の詳細については、DbContextの備考セクションを参照してください。

DbContextの備考セクションから:

パラメータなしのDbContextコンストラクタが派生コンテキストから呼び出された場合、派生コンテキストの名前を使用して、app.configファイルまたはweb.configファイルで接続文字列が検索されます。

デコンパイラーを使用してのデフォルトコンストラクターのコードを調べると、インスタンスをDbContext呼び出し、その値を使用して接続文字列を検索していることがわかります。したがって、完全修飾型名が接続文字列の命名に使用する有効な規則である理由は完全に理にかなっています。GetType().ToString()DbContextDbContext

あなたの例でUserDbContextは、はネストされたクラスであるため、は適切な名前ではありません。名前空間は省略できますが、少なくとも接続文字列に名前を付ける必要がありますUsers+UserDbContext。接続文字列をクラス名だけと一致させたい場合は、モデル内にネストすることはできません。

于 2013-01-13T18:15:26.263 に答える