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 迁移来更新数据库

我首先在 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

像下面这样的东西?

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 回答
0

我不确定这是否可行,但你能做这样的事情吗?

DatabaseSeeder<TContextType> : DropCreateDatabaseAlways<TContextType> where TContextType : DatabaseContextBase
于 2012-11-06T20:57:06.663 回答