私は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を作成します。
足場を機能させるにはどうすればよいですか?
試行錯誤によって、エラーの原因となっているコード行(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?
また、MVC Music Storeアプリケーションの構築に関するチュートリアルを実行しているときに、この症状に遭遇しました。
Visual Studioには間違いなくバグがあるようです。このバグを引き起こすと思われるのは、接続文字列に使用されるデフォルト以外の名前を選択することです。
この回避策を見つけてくれた http://forums.asp.net/t/1838396.aspx/1 のユーザーdwaynefに感謝します。
新しい足場コントローラーの追加中に一時的に、web.configで接続文字列の名前を 'DefaultConnection'に変更する必要があります。
<connectionStrings>
<add name="DefaultConnection" ... />
</connectionStrings>
接続文字列が複数ある場合は、アクションの実行中にこの接続文字列のみが存在することを確認してください。
ここに私の2セントの価値があります。あなたのソリューションが実際の問題に実際に対処しているとは思わない。実際の解決策は、接続文字列名ではなくデータベース名を基本コンストラクタに渡すことです。そのため、接続文字列が
<add name="MyContext" connectionString="Data Source=|DataDirectory|MyDatabase.sdf" providerName="System.Data.SqlServerCe.4.0" />
コンテキストクラスは次のように定義する必要があります
public class MyContext : DbContext
{
public MyContext() : base("MyDatabase") { }...
私と同じように、これがあなたや他の人にも役立つことを願っています。
ここに私のために働いたものがあります:
providerName="System.Data.SqlClient"
の代わりに
providerName="System.Data.SqlServerCe.4.0"
System.Data.SqlServerCe.4.0
」に戻します。私のために働く:「新しい足場アイテムを追加」ダイアログで、私は任意の名前で新しいコンテキスト(プラス)を追加しました(私にとっては「ScaffoldingContext」)。その後、足場が機能します。コントローラーのコンテキストの名前を変更するだけです。
これは、関連付けプロパティまたは外部キー属性が原因である場合があります
モデルクラスの1つに[NotMapped]
属性がないために問題が発生している可能性があります。
属性を逃し、頭をunningしていたので。
[Display(Name="Logo")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileBase Logo { set; get; }
別のオプションを試した後、以下の方法でエラーを解決します。
接続文字列の名前の値がコンストラクタに渡された値と一致する場合、機能します。
public MyThingDb()
: base("name=MyContext")
{
}
これを解決するには、Ctrlキーを押しながらF5キーを押してプロジェクトを再構築し、コントローラーを追加します。
足場を使用してコントローラーからビューを作成しようとすると、同様の問題が発生しました。ビューの作成ダイアログで、「データコンテキストクラス」ドロップダウンをクリアしてから、スキャフォールディングメカニズムの説明をよくしました。
同様の問題がありましたが、デフォルトのコンストラクターではありませんでした。ソリューションに複数のプロジェクトがあり、MVCプロジェクトに対応する「Web」がEntityFrameworkを参照していない場合にも発生します。
私のために働いた解決策は、接続文字列と同じデータベース名をdbContextクラスのベースコンストラクタに渡すことです。
内部の「もの」を変更する
public
DbSet<MyThing> Things
{ get; set; }
}
「Database1」には、「Database1」はWeb.config
ファイルに「Database1.sdf」として表示されるディスク上のデータベースファイルの名前です。
コンテキストクラスでは、scaffoldingを使用してコントローラーを作成するときに、DbConfigurationTypeをコメントする必要があります。
//[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class NameDbContext
{}
これは私のために働いたものです..
'System.Data.SqlServerCe.4.0'を使用して接続文字列をコメントアウトしてから、足場テンプレートを使用してコントローラーを追加しました。
同じエラーメッセージが表示されましたが、接続文字列とは何の関係もありませんでした。
非常にまれなケースですが、うまくいけば誰かの助けになるでしょう。モデル名は、名前空間名のセグメントの1つと同じでした。
例えば:
namespace blah.blah.Building
public class Building
名前空間の名前を変更し、すべての使用法を修正すると、t4の足場が機能しました!
彼女は別の可能な解決策です。最初に「依存」モデルの足場を実行する必要がある場合があります。次に、多くの依存関係を持つ複雑なモデルに進みます。
MVC 5/EF 6
おそらくあなたは古いバージョンでこれを行うことができますか?
私のために働いた!