1

この質問が重複している可能性があることはわかっていますが、問題の解決策はまだ見つかりません。

私は持っている:

protected void Application_Start()
        {
            Database.SetInitializer(new DatabaseSeeder());
            DatabaseContext c = new DatabaseContext();
            c.Database.Initialize(true);

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);


        }

私のデータベースシーダーは次のとおりです。

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>
    {
        protected override void Seed(DatabaseContextBase context)
        {
            base.Seed(context);

            var roles = new[] {"Admin", "User"};
            foreach (var role in roles)
            {
                context.Roles.Add(new UserRole {FullName = role});
            }

            context.SaveChanges();
        }
    }

私のコンテキストは次のとおりです。

public abstract class DatabaseContextBase : DbContext
    {
        public DbSet<UserRole> Roles { get; set; }
        public DbSet<UserAndPermissionInGroup> UserAndPermissions { get; set; }
        public DbSet<GeneralUser> Users { get; set; }
        public DbSet<Group> Groups { get; set; }
        public DbSet<Forum> Forums { get; set; } 

        public DatabaseContextBase() :base("ForumDb")
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Comment>()
                .HasRequired(e => e.Owner)
                .WithMany(t => t.Comments)
                .HasForeignKey(e => e.OwnerId)
                .WillCascadeOnDelete(false);
        }
    }

そして最後に:

public class DatabaseContext : DatabaseContextBase

{

}

問題は、この初期化子を使用しても、次のエラーが発生することです。

データベースが作成されてから、'DatabaseContext' コンテキストをサポートするモデルが変更されました。Code First Migrations を使用してデータベースを更新することを検討してください

ASP.NET MVC 3 プロジェクトで最初に EF 5 コードを使用しています。助言がありますか?

4

4 に答える 4

4

派生型では Database.SetInitializer が機能しないようです。イニシャライザをから変更しました

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContext>

そして今コード:

Database.SetInitializer(new DatabaseSeeder());
DatabaseContext c = new DatabaseContext();
c.Database.Initialize(true);

かなりうまく機能します。すべての回答に感謝します。

于 2012-09-26T17:19:51.660 に答える
2

データを失うことに慣れている場合は、モデルに変更を加えるときに、次のことを試してください。

DatabaseSeeder : DropCreateDatabaseIfModelChanges<DatabaseContextBase>

それ以外の

DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>

そうすれば、モデルに変更を加えると、最新のモデルを使用してデータベースが再作成され、シード メソッドが呼び出されます。

データを保持したい場合は、移行について読み始める必要があります。

  1. コードファーストの移行
  2. 自動移行
于 2012-09-24T22:53:09.433 に答える
0

これでうまくいくかどうかわかりませんが、このようなことができますか?

DatabaseSeeder<TContextType> : DropCreateDatabaseAlways<TContextType> where TContextType : DatabaseContextBase
于 2012-11-06T20:57:06.663 に答える
0

以下のようなものですか?

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions
            .Remove<System.Data.Entity.Database.IncludeMetadataConvention>()
            .Entity<Comment>()
            .HasRequired(e => e.Owner)
            .WithMany(t => t.Comments)
            .HasForeignKey(e => e.OwnerId)
            .WillCascadeOnDelete(false);
    }
于 2012-09-24T22:55:49.033 に答える