261

エラーメッセージ:

「データベースが作成されてから、「AddressBook」コンテキストをサポートするモデルが変更されました。データベースを手動で削除/更新するか、IDatabaseInitializerインスタンスを使用してDatabase.SetInitializerを呼び出します。たとえば、RecreateDatabaseIfModelChangesストラテジーは、データベースを自動的に削除して再作成します。オプションで、新しいデータをシードします。」

私はコードファースト機能を使おうとしていますが、次のように書いています。

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

コンテキストクラス:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

および接続文字列:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

したがって、データベース名は「AddressBook」であり、連絡先オブジェクトをコンテキストに追加しようとするとエラーが発生します。ここに何か足りないものがありますか?

4

27 に答える 27

414

今は次のとおりです。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

YourDbContext.cs ファイルで。

于 2011-05-26T18:08:09.190 に答える
138

ジェフが実際に何が起こっているかについて投稿したスコット・グのブログからの情報は次のとおりです。

この例外を見ている人のために:

「データベースが作成されてから、「本番」コンテキストをサポートするモデルが変更されました。データベースを手動で削除/更新するかDatabase.SetInitializerIDatabaseInitializerインスタンスを使用して呼び出してください。」

これが何が起こっているのか、そしてそれについて何をすべきかです:

モデルが最初に作成されるときに、DatabaseInitializerを実行して、データベースがない場合はデータベースを作成したり、シードデータを追加したりします。デフォルトのDatabaseInitializerは、モデルを使用するために必要なデータベーススキーマを、データベースで作成されたEdmMetadataテーブルに格納されているスキーマのハッシュと比較しようとします(Code Firstがデータベースを作成する場合)。既存のデータベースにはEdmMetadataテーブルがないため、ハッシュもありません…そして、そのテーブルが欠落している場合、今日の実装はスローされます。これはデフォルトであるため、最終バージョンを出荷する前に、この動作の変更に取り組みます。それまでは、既存のデータベースは通常、データベース初期化子を必要としないため、以下を呼び出すことにより、コンテキストタイプに対してオフにすることができます。

Database.SetInitializer<YourDbContext>(null);

ジェフ

于 2011-06-02T11:40:18.320 に答える
41

Entity Framework 5.0.0.0 ~ 6.1.3の場合

あなたは本当に次のことをしたいです:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

はい、マット・フリアは正しいです。更新-編集: 警告は、このコードをglobal.asaxに追加する代わりに、DbContextクラスに追加するという点で他の人に同意することです

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

他の人が述べたように、これは単体テストの処理にも適しています。

現在、これを Entity Framework 6.1.3 /.net 4.6.1 で使用しています

近い将来、コア スニペットを提供するために戻ってきます。

于 2013-02-21T02:25:19.753 に答える
31

この修正は、CTP5 以降は機能しません。

あなたがしなければなりませんDatabase.SetInitializer<YourContext>(null);

于 2011-02-28T15:51:23.587 に答える
18

答えを見つけて、ここで更新することを考えました。次のことを行うだけです。

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}
于 2010-08-30T12:47:13.857 に答える
16

または、次の行を Global.asax.cs ファイルの Application_Start() の下に配置できます。

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

ProjectName.Path.Context を名前空間とコンテキストに変更してください。最初にコードを使用すると、スキーマに変更が加えられるたびに、新しいデータベースが削除されて作成されます。

于 2012-12-01T01:43:02.007 に答える
5

私の場合、4.3.1 へのアップグレードでは、EdmMetaData テーブルを切り詰めるか、完全に削除します。

于 2012-05-04T12:57:53.420 に答える
2

私はこの問題を抱えていました.1つのプロジェクトはSQLExpressを指していましたが、問題のあるプロジェクトはLocalDbを指していた. (それぞれの web.config 内)。ばかげた見落としですが、他の誰かがこの問題のトラブルシューティングを行っている場合に備えて、ここで注目する価値があります。

于 2014-01-02T00:18:50.857 に答える
2

同じ問題がありました-移行の再追加とデータベースの更新は機能せず、上記の答えはどれも正しくないようでした。その後、ひらめきがひらめきました。私は複数の階層 (1 つの Web、1 つのデータ、および 1 つのビジネス) を使用しています。データ層には、コンテキストとすべてのモデルがあります。Web レイヤーはこの例外をスローしませんでした。これはビジネス レイヤー (テストとデバッグ用のコンソール アプリケーションとして設定したもの) でした。ビジネス層がデータベースを取得してコンテキストを作成するために正しい接続文字列を使用していなかったことが判明しました。そのため、接続文字列をビジネス層 (およびデータ層) のアプリ構成に追加すると、それが機能します。同じ問題に遭遇する可能性のある他の人のために、これをここに置いてください。

于 2016-09-30T19:02:15.373 に答える
1

このエラーは、接続文字列の問題と、接続文字列名がデータベース コンテキスト宣言と一致するかどうかを示している可能性があります。

このエラーが発生したのは、ローカル データベースの名前を間違って (ばかげた間違い)、web.config の "DefaultConnection" の接続文字列の名前が MyDbContext と一致しなかったためです。

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>
于 2014-08-31T20:16:47.207 に答える
0

このトピックに関する調査の結果、基本的に、ローカルSQLServerExpressで以前に作成されたdbのインスタンスがある場合にエラーが発生することがわかりました。したがって、dbを更新し、dbを更新しようとするときはいつでも、;Update Databaseを使用してコマンドを実行せずにdbでコードを実行してください。Package Manager Consoleまず、ローカルSQLExpressの以前のデータベースを手動で削除する必要があります。

また、このソリューションは、構成に含まれていない限り機能AutomaticMigrationsEnabled = false;します。

バージョン管理システム(git、svnなど)を使用していて、他の開発者が本番フェーズでdbオブジェクトを更新する場合、コードベースを更新してアプリケーションを実行するたびにこのエラーが発生します。

上で述べたように、これにはコードベースでいくつかの解決策があります。ただし、これが最も実用的な場合もあります。

于 2012-12-19T14:45:01.823 に答える
0

奇妙ですが、ここでのすべての回答は役に立ちませんでした。私にとってはイニシャライザが機能しました

MigrateDatabaseToLatestVersion

これが私の解決策です(私は知っています、それははるかに簡単になる可能性がありますが、それは私がそれを使用する方法です):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting は DropCreateDatabaseAlways から継承するだけなので、特定のケース (テスト) では、データベース全体が再構築されます。それ以外の場合は、最新バージョンに移行されます。

私の情報源: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

于 2015-06-15T07:03:06.243 に答える
0

2 つのアプリケーションに 1 つのデータベースを使用したときも、同じ問題がありました。disableDatabaseInitialization="true"コンテキストタイプセクションでの設定は私にとってはうまくいきます。

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

詳細を見るhttps://msdn.microsoft.com/en-us/data/jj556606.aspx

于 2016-04-14T21:24:00.280 に答える
0

次のイベントをGlobal.asax.cs含む変更:Application_Start

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
于 2014-01-30T17:10:09.007 に答える
0

カスタム コンテキスト初期化子を作成します。

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

Migrations.Configuration は、パッケージ マネージャー コンソールの移行コマンド ラインによって生成されるクラスであることに注意してください。Migrations.Configuration クラスの internal を public 修飾子に変更する必要がある場合があります。

OmModelCreating から登録します。

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}
于 2018-07-23T12:38:50.550 に答える
0

Pro ASP.NET MVC 4 の本も読んでいますが、あなたが抱えていたのと同じ問題に遭遇しました。私にとっては、本の「モデル検証の追加」セクションで規定されている変更を加えた後、問題が発生し始めました。問題を解決する方法は、データベースを localdb から本格的な SQL Server 2012 サーバーに移動することです。(ちなみに、完全なバージョンに切り替えることができて幸運であることはわかっているので、私を嫌いにならないでください。;-))) 問題を引き起こしているデータベースへの通信に何かがあるに違いありません。

于 2013-01-24T20:08:57.063 に答える
-3

ここで、コンテキストが変更されたときにモデル バッキングのエラーを防ぐ別の方法を共有したいと思います。

1) DbContext ファイルを開きます

2) Microsoft.AspNet.Identity.EntityFramework を使用して名前空間を追加します。

3) public MyDbContext() : base("name=MyDbContext") { Database.SetInitializer(new DropCreateDatabaseAlways()); }

于 2015-09-29T07:19:33.890 に答える