0

私は次のように定義されたインターフェースを持っています:

public interface ICMDBContext
{
    DBSet<Building> {get;}
    DBSet<Room> {get;}
    more DBSet methods...

    string Save()
 }

私はCMDB_DataModelContainerという名前のDBContextで生成されたクラスを持っています。

私は次のように見えるICMDBContextを実装する部分クラスCMDB_DataModelContainerを持っています(そして、はい、両方とも同じ名前空間にあります):

public partial class CMDB_DataModelContainer : ICMDBContext
{
    string Save() { implemenation... }
}

すべてが正常にコンパイルされますが、コントローラーを作成し、CMDB_ModelConatinerをコンテキストクラスとして使用しようとすると(強く型付けされたコントローラーを作成すると)、エラーが発生します

'CMDB.Domain.Models.CMDB_DataModelContainer'の生成中にエラーが発生しました。プロジェクトを再構築してみてください。

部分クラスを削除して、コントローラーを作成できました。なぜこれが起こるのか、何か考えはありますか?

さらに、DBContextクラスは別のプロジェクトにあります。

それが別のプロジェクトにあるという事実は重要ではありません。同じプロジェクトでDBcontextクラスとMVC3アプリを使用してテストプロジェクトを作成しましたが、それでも失敗しました。

モデルファーストアプローチを使用するときに、誰かが実際にリポジトリをセットアップしたかどうかという質問があると思います。モデルを最初に使用するときにこのパターンを適用しようとすると、問題が発生します。

問題を再現したい場合は、MVC 3(または4、私は3を使用)を作成します。これは私が自分でそれを再現するためのテストのためにしたことです。

新しいADO.Netエンティティデータモデルを追加します。

  • TacoとFillingの2つのエンティティを作成します
  • それぞれに「名前」スカラープロパティを追加します。
  • 関連付けを追加m<--->m
  • モデルフォルダに「Partial」という名前の新しいフォルダを作成します。
  • 新しいクラスを追加します-クラスの名前はContextクラスと同じで(デフォルトの名前のままにした場合はModel1Containerにする必要があります)、同じ名前空間にある必要があります。

例えば

public partial class Model1Container
{

}

-強く型付けされた新しいコントローラー「TacoController」を追加します。ご想像のとおり、Tacoであり、コンテキストクラスとしてModel1Containerを使用します。出来上がり、再現。はい、タコスが好きです。

4

1 に答える 1

0

おそらくお気づきかもしれませんが、部分クラスを削除(/名前変更)し、コントローラーを作成してから、部分クラスを復元​​することは、適切な回避策のようです。理由について:

私が試したとき、何か奇妙なことに気づきました。作成した部分クラスファイルに新しい宣言が表示されました。

public DbSet<Taco> Taco { get; set; }

VSが部分クラスファイルによって混乱していると推測することしかできません-作成した部分クラスファイルを見つけ、宣言されたDBSetを確認せず、追加しようとすると、タコスが多すぎるために混乱します。

クリス

于 2012-07-20T07:47:57.643 に答える