3

次のエラーが表示されます。

オブジェクト名 'dbo.ImageMetas' が無効です。

この行で:

ビューを返します (db.Images.ToList());

私のデータベースコンテキストは次のようになります:

public class GalleryContext : DbContext
{
    public GalleryContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<ImageMeta> Images { get; set; }
    public DbSet<ImageFile> ImageFiles { get; set; }
}

そして私のモデル:

public class ImageMeta
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public UserProfile User { get; set; }
    public string Name { get; set; }
    public virtual ICollection<ImageFile> Files { get; set; } 
}

これは真新しい MVC4 プロジェクトです。最初にモデルを作成し、次にコントローラーを自動生成しました。

データベースを調べたところ、実際にテーブルがありません。

ただし、テーブルが自動作成されるという印象を受けました。このチュートリアルが示唆するように。

では、なぜそうしないのでしょうか。


コンテキストにちなんで名付けられた接続文字列を追加すると (そして基本コンストラクターを削除すると)、動作するようになりました。では、なぜ DefaultConnection を使用できないのでしょうか。

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

3 に答える 3

2

存在しないデータベースを接続文字列に入れてみてください。EF Code-First は、データベースが既定で存在しない場合 (もちろん、提供された資格情報にデータベースを作成する権限がある場合) にデータベースを作成しますが、既存のデータベースは変更しません (既存のデータに影響を与える可能性があるため)。

既存のデータベースへの変更は、コード ファースト マイグレーションを使用して行うことを意図しています。

編集:

または、データをまったく気にしない場合は、モデルを変更するたびにデータベースを削除して再作成するデータベース初期化子を設定できます (つまり、global.asax アプリケーションの開始で)。

DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseIfModelChanges<MyDBContext>());

詳細については、 DropCreateDatabaseIfModelChanges クラスを参照してください。

于 2012-09-02T21:24:27.927 に答える
1

データベースファーストアプローチを使用しているときにも同じ問題が発生しました。サービス/サービスのホスト web.config の接続文字列が正しくありませんでした。接続文字列を修正したところ、うまくいきました。

于 2014-08-20T10:59:58.283 に答える