25

RTMバージョンのWindows8とVS2012Ultimateを使用しています。コードファーストエンティティフレームワークモデルでSqlCe4.0を使用する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を作成してください。

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

4

17 に答える 17

11

試行錯誤の結果、エラーの原因となっているコード行(DbContext ctor)が見つかりました。

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

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

WTF?

于 2012-08-28T18:30:38.910 に答える
9

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

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

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

新しいスキャフォールディングコントローラの追加中に一時的に、web.configで接続文字列の名前を「DefaultConnection」に変更する必要があります。

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

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

于 2012-12-07T09:14:59.500 に答える
8

これが私の2セントの価値です。あなたの解決策が実際に本当の問題に対処しているとは思いません。実際の修正は、基本コンストラクターに接続文字列名ではなくデータベース名を渡すことです。したがって、接続文字列が

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

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

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

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

于 2013-01-29T05:25:33.540 に答える
5

これが私のために働いたものです:

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

それ以外の

providerName="System.Data.SqlServerCe.4.0"

  • コントローラを生成します。
  • ProviderNameの名前を「System.Data.SqlServerCe.4.0」に戻します。
  • プロジェクトを実行します。
于 2013-06-04T23:01:00.713 に答える
4

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

于 2015-12-05T13:15:41.523 に答える
2

さまざまなオプションを試した後、次の方法でエラーを解決します。

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

 public MyThingDb()
        : base("name=MyContext")
    {
    }
于 2013-03-17T11:06:09.470 に答える
2

[NotMapped]モデルクラスの1つに属性がないことが原因である可能性があります 。

私は属性を逃し、頭を狡猾にしていたので。

[Display(Name="Logo")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileBase Logo { set; get; }
于 2014-08-15T08:51:21.103 に答える
2

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

于 2016-12-13T14:20:22.053 に答える
1

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

于 2013-01-28T05:04:44.040 に答える
1

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

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

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

于 2013-05-02T10:02:07.193 に答える
1

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

于 2013-07-26T08:58:35.287 に答える
1

コントローラを追加する前に、CTRL + F5を押してプロジェクトを再構築することで、これを解決しました。

于 2014-04-29T16:43:27.613 に答える
1

スキャフォールディングを使用してコントローラーからビューを作成しようとしたときに、同様の問題が発生しました。[ビューの作成]ダイアログで、[データコンテキストクラス]ドロップダウンをクリアしてから、スキャフォールディングメカニズムを適切に表現しました。

于 2018-06-12T13:37:34.343 に答える
0

これは私のためにうまくいったことです..

'System.Data.SqlServerCe.4.0'を使用して接続文字列をコメントアウトしてから、スキャフォールディングテンプレートを使用してコントローラーを追加しました。

于 2014-03-07T07:33:48.697 に答える
0

コンテキストクラスでは、スキャフォールディングを使用してコントローラーを作成するときに、DbConfigurationTypeにコメントを付ける必要があります。

//[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class NameDbContext 
{}
于 2016-03-15T16:41:57.670 に答える
0

MVC 5 / EF 6

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

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

私のために働いた!

于 2017-10-19T14:18:07.193 に答える
0

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

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

例えば:

namespace blah.blah.Building

public class Building

名前空間の名前を変更し、すべての使用法を修正したところ、t4スキャフォールディングが機能しました。


彼女のもう一つの可能​​な解決策。最初に「依存」モデルのスキャフォールディングを実行する必要がある場合があります。次に、多くの依存関係を持つ複雑なモデルに到達します。

于 2018-04-13T14:01:32.007 に答える