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

Posted

技术标签:

【中文标题】在 EF 6 和 MVC 5 中使用 Code First 方法将新表添加到现有数据库【英文标题】:Add new table to an existing database using Code First approach in EF 6 and MVC 5 【发布时间】:2015-03-13 13:44:12 【问题描述】:

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

我要做的是将表 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 类中,我也添加了带有 modelBuilder 变量的上下文类 PostContext,正如他们在上面列出的链接中所建议的那样:

 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。

【问题讨论】:

您是否将您的课程添加到您的上下文中?我们可以查看您的上下文文件吗? @vgSefa 当然,我刚刚更新了我的帖子并添加了 PostContext 类代码:) 这是 SQL Server,对吧? (我问是因为迁移不适用于 SQLite 的 ADO.NET 提供程序)。 @bvgheluwe 是的。我的意思是它是一个本地数据库,但据我所知,VS 2013 默认使用 SQL Server。 :) 当我向 AspNetUsers 表添加新列时,迁移确实有效,因此该数据库肯定支持它们......我错过了一些步骤,并且不知道它可能是什么...... :( 将您的 DefaultConnection 重命名为 PostContext 【参考方案1】:

这里发生的情况是您在启用迁移之前已有数据库表。 所以 Entity Framework 认为你所有的数据库对象都需要创建,这可以通过打开你的 PostMigration 迁移文件来看到。

最好的方法是在添加 Post 表之前诱使 EF 进行初始迁移,然后在之后执行 Posts 迁移。

步骤

    注释掉 DBContext 中的帖子,以便 EF 不知道帖子

    //public DbSet<Post> Posts  get; set; 
    

    启用迁移

    Enable-Migrations
    

    在更改之前添加包含所有表的初始迁移

    Add-Migration "InitialBaseline" –IgnoreChanges
    

    现在更新数据库,这将创建一个 MigrationHistory 表,以便 EF 知道已经运行了哪些迁移。

    Update-Database
    

    现在您可以取消注释 1 中的“Do your change”

    通过添加帖子创建新迁移

    Add-Migration "PostMigration"
    

    现在进行更新...希望一切正常。

    Update-Database
    

现在所有迁移都已设置完毕,并且它们是基准,未来的迁移将很容易。

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

【讨论】:

感谢您的回答。 :) 我已经尝试过你所说的,但仍然没有。我也在尝试用不同的方法来解决这个问题,但也没有成功。我也会将其添加到我编辑的帖子中。 :(@奥利弗 在第 6 步之后:如果您不能这样做,则转到该迁移配置中的 Up 方法并删除创建表的代码。然后按照第 7 步:@nemo_87 非常感谢您!正是我想要的。我很难掌握新模型的创建。 :)

以上是关于在 EF 6 和 MVC 5 中使用 Code First 方法将新表添加到现有数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?

将 asp.net 5 MVC 6 与 Identity 和 EF 6 一起使用的示例

MVC 5 的 EF6 Code First 入门

与 MVC 3、.NET 4.5 和 EF 6 并行获取数据

MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)

MVC5与EF6 Code First 第一个入门完整实例教程