使用EF 6和MVC 5中的Code First方法将新表添加到现有数据库

时间:2015-01-15 07:49:32

标签: asp.net-mvc entity-framework asp.net-mvc-5 ef-migrations

我知道这应该很简单,但我无法在网上找到关于这个主题的正确教程或解释。有很多关于使用代码优先方法向现有表添加新列的视频和帖子,但我找不到任何关于如何将整个新表添加到现有数据库的分步说明。 这很奇怪,我很确定我会找到很多例子。也许我的搜索条件很差。所以如果有人有任何好的链接或视频,请分享。

我要做的是将表Post添加到由MVC 5项目创建的现有默认数据库中。 我先创建了模型类,将其命名为Post,它有一个简单的定义:

public class Post
    {
        [Key]
        public int PostId { get; set; }
        public string PostText { get; set; }
        public byte[] ImagePost { get; set; }
        public byte[] FilePost { get; set; }
        public string TextPost { get; set; }
        public string UserId { get; set; }
    } 

然后我先怀疑。我知道我应该创建DbContext,但是如果我想要访问现有数据库,我应该使用现有的DbContext,默认情况下已经在Web.config文件中创建了这样的:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-StudentBookApp-20150114035149.mdf;Initial Catalog=aspnet-StudentBookApp-20150114035149;Integrated Security=True"
      providerName="System.Data.SqlClient" />

或者我应该使用为Post类创建的所有新DbContext?

无论如何我都试过了,但没有成功。当我创建这个新的上下文时,我在PMC中进行了以下操作:

Enable-Migrations
Add-Migration "PostMigration"
Update-Database

通常,或者一切顺利,但我没有在数据库中获得任何新表,或者我收到错误:AspNetUsers已经存在,AspNetUsers是我通过添加新列更改的自动创建的表之一它。

更新:我现在的上下文是在名为PostContext的分隔类中,它看起来像这样:

public class PostContext : DbContext
{
    public PostContext() : base("name=PostContext")
    {
    }

    public DbSet<Post> Posts { get; set; }
}

第二次尝试:

由于我的第一种方法没有给出任何结果。我已经尝试过做link中描述的内容。添加映射到我的项目:

我创建了用于映射的新类PostConfiguration:

public class PostConfiguration : EntityTypeConfiguration<Post>
    {
        public PostConfiguration() : base()
        {
            HasKey(p => p.PostId);
            ToTable("Post");

            HasOptional(p => p.PostText);
            ToTable("Post");

            HasOptional(p => p.ImagePost);
            ToTable("Post");

            HasOptional(p => p.TextPost);
            ToTable("Post");

            HasOptional(p => p.FilePost);
            ToTable("Post");

            HasRequired(p => p.UserId);
            ToTable("Post");
        }
    }

在Post类我已经添加了上下文类PostContext和modelBuilder变量,正如他们在上面列出的链接中所建议的那样:

 public class PostContext : DbContext
    {
        static PostContext()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PostContext>());
        }

        public DbSet<Post> Posts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties()
                        .Where(p => p.Name == "Key")
                        .Configure(p => p.IsKey());

            modelBuilder.Configurations.Add(new PostConfiguration());
        }

   }

我再次运行所有PMC命令,但仍未成功,默认数据库中缺少表Post。

1 个答案:

答案 0 :(得分:17)

这里发生的事情是,在启用迁移之前,您已有现有的数据库表。 因此,实体框架认为需要创建所有数据库对象,这可以通过打开PostMigration迁移文件来看到。

最好的方法是在添加Post表之前将EF引入初始迁移,然后再执行Posts迁移。

步骤

  1. 在DBContext中注释帖子,以便EF不了解帖子

    //public DbSet<Post> Posts { get; set; }
    
  2. 启用迁移

    Enable-Migrations
    
  3. 在更改之前添加包含所有表的初始迁移

    Add-Migration "InitialBaseline" –IgnoreChanges
    
  4. 现在更新数据库,这将创建一个MigrationHistory表,以便EF知道已经运行了哪些迁移。

    Update-Database
    
  5. 现在,您可以将1中的行取消注释为&#34;进行更改&#34;

  6. 通过添加帖子

    创建新的迁移
    Add-Migration "PostMigration"
    
  7. 现在进行更新......希望它一切正常。

    Update-Database
    
  8. 现在,所有迁移都已设置好并且它们已成为基线,未来的迁移将很容易。

    有关详细信息,我发现此链接很有用: http://msdn.microsoft.com/en-us/data/dn579398.aspx