web-dev-qa-db-ja.com

MVC4 Scaffolding Add Controllerで「メタデータを取得できません...」というエラーが表示される

私はRTM Windows 8およびVS 2012 Ultimateのバージョンです。SqlCe 4.0 with code first entity framework model。を使用するMVC4プロジェクトがあります。

モデルは非常に単純です:

   public class MyThing
    {
        public int MyThingId { get; set; }

        public int UserId { get; set; }
        public string Title { get; set; }
        public string Address { get; set; }
        public string Description { get; set; }
        public DateTime Date { get; set; }
  }

組み込みのscaffoldを使用して新しいコントローラーを作成しようとすると、次のエラーが表示されます。

「MyThingのメタデータを取得できません」

「同じDbCompiledModelを使用して異なるタイプのデータベースサーバーに対してコンテキストを作成することはサポートされていません。代わりに、使用されるサーバーのタイプごとに個別のDbCompiledModelを作成します。

足場を機能させるにはどうすればよいですか?

24
Schneider

試行錯誤によって、エラーの原因となっているコード行(DbContextアクター)を見つけました。

public class MyThingDb : DbContext
{
    // If I comment this constructor out the scaffolding works
    public MyThingDb()
        : base("DefaultConnection")
    {
    }

    public DbSet<MyThing> Things{ get; set; }
}

WTF?

11
Schneider

また、MVC Music Storeアプリケーションの構築に関するチュートリアルを実行しているときに、この症状に遭遇しました。

Visual Studioには間違いなくバグがあるようです。このバグを引き起こすと思われるのは、接続文字列に使用されるデフォルト以外の名前を選択することです。

この回避策を見つけてくれた http://forums.asp.net/t/1838396.aspx/1 のユーザーdwaynefに感謝します。

新しい足場コントローラーの追加中に一時的に、web.configで接続文字列の名前を 'DefaultConnection'に変更する必要があります。

<connectionStrings>
     <add name="DefaultConnection" ... />
</connectionStrings>

接続文字列が複数ある場合は、アクションの実行中にこの接続文字列のみが存在することを確認してください。

9
Henrik

ここに私の2セントの価値があります。あなたのソリューションが実際の問題に実際に対処しているとは思わない。実際の解決策は、接続文字列名ではなくデータベース名を基本コンストラクタに渡すことです。そのため、接続文字列が

<add name="MyContext" connectionString="Data Source=|DataDirectory|MyDatabase.sdf" providerName="System.Data.SqlServerCe.4.0" />

コンテキストクラスは次のように定義する必要があります

    public class MyContext : DbContext 
{
    public MyContext() : base("MyDatabase") { }... 

私と同じように、これがあなたや他の人にも役立つことを願っています。

8
Mr Nice

ここに私のために働いたものがあります:

  • Web.configの接続文字列に移動して、次を変更します。providerName="System.Data.SqlClient"

の代わりに

providerName="System.Data.SqlServerCe.4.0"

  • コントローラーを生成します。
  • ProviderNameの名前を「System.Data.SqlServerCe.4.0」に戻します。
  • プロジェクトを実行します。
5
SolidSnake

私のために働く:「新しい足場アイテムを追加」ダイアログで、私は任意の名前で新しいコンテキスト(プラス)を追加しました(私にとっては「ScaffoldingContext」)。その後、足場が機能します。コントローラーのコンテキストの名前を変更するだけです。

4
Suplanus

これは、関連付けプロパティまたは外部キー属性が原因である場合があります

2
irfandar

モデルクラスの1つに[NotMapped]属性がないために問題が発生している可能性があります。

属性を逃し、頭をunningしていたので。

[Display(Name="Logo")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileBase Logo { set; get; }
2
blin2linkme

別のオプションを試した後、以下の方法でエラーを解決します。

接続文字列の名前の値がコンストラクタに渡された値と一致する場合、機能します。

 public MyThingDb()
        : base("name=MyContext")
    {
    }
2
VivekPKumar

これを解決するには、Ctrlキーを押しながらF5キーを押してプロジェクトを再構築し、コントローラーを追加します。

1
nu everest

足場を使用してコントローラーからビューを作成しようとすると、同様の問題が発生しました。ビューの作成ダイアログで、「データコンテキストクラス」ドロップダウンをクリアしてから、スキャフォールディングメカニズムの説明をよくしました。

1
Hugo

同様の問題がありましたが、デフォルトのコンストラクターではありませんでした。ソリューションに複数のプロジェクトがあり、MVCプロジェクトに対応する「Web」がEntityFrameworkを参照していない場合にも発生します。

1
Sergey

私のために働いた解決策は、接続文字列と同じデータベース名をdbContextクラスのベースコンストラクタに渡すことです。

1
guest

内部の「もの」を変更する

public
DbSet<MyThing> Things
{ get; set; }
}

「Database1」には、「Database1」はWeb.configファイルに「Database1.sdf」として表示されるディスク上のデータベースファイルの名前です。

1
Mawuli Sevor

コンテキストクラスでは、scaffoldingを使用してコントローラーを作成するときに、DbConfigurationTypeをコメントする必要があります。

//[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class NameDbContext 
{}

これは私のために働いたものです..

'System.Data.SqlServerCe.4.0'を使用して接続文字列をコメントアウトしてから、足場テンプレートを使用してコントローラーを追加しました。

0
bunny hop

同じエラーメッセージが表示されましたが、接続文字列とは何の関係もありませんでした。

非常にまれなケースですが、うまくいけば誰かの助けになるでしょう。モデル名は、名前空間名のセグメントの1つと同じでした。

例えば:

namespace blah.blah.Building

public class Building

名前空間の名前を変更し、すべての使用法を修正すると、t4の足場が機能しました!


彼女は別の可能な解決策です。最初に「依存」モデルの足場を実行する必要がある場合があります。次に、多くの依存関係を持つ複雑なモデルに進みます。

0
Jess

MVC 5/EF 6

おそらくあなたは古いバージョンでこれを行うことができますか?

  1. web/app.configの接続文字列をコメントアウトしてから保存します
  2. 新しいコントローラーを作成し、VSが既に持っているものを選択する代わりに「新しい」dbcontextアイテムを作成するようにします。
  3. 作成をクリックします
  4. 新しいdbcontextクラスを削除します
  5. コントローラのdbcontextをあなたのものに置き換えます
  6. web/app.configの接続文字列のコメントを解除してから保存します

私のために働いた!

0
Rick Penabella