【问题标题】:asp mvc code first update model without lossing dataasp mvc代码先更新模型不丢失数据
【发布时间】:2019-05-15 07:00:03
【问题描述】:

我有以下DbContext

namespace Tasks.Models
{
    public class TaskDBInitializer :  DropCreateDatabaseIfModelChanges<TasksContext>
    {
        protected override void Seed(TasksContext context)
        {
            var projects = new List<Projects>
            {
                new Projects{ Title="proTitle", Describe="proDescribe" },
            };
            projects.ForEach(p => context.Projects.Add(p));
            context.SaveChanges();
            base.Seed(context);;
        }
    }

    public class TasksContext : DbContext
    {
        public TasksContext() : base("name=TaskDB")
        {
            Database.SetInitializer(new TaskDBInitializer());
        }
        public DbSet<Task> Task { get; set; }
        public DbSet<Projects> Projects { set; get; }
    }
}

我现在想添加另一个模型,但不想丢失当前数据库中存在的数据。

如何在不丢失数据的情况下将模型添加到我的 DbContext

【问题讨论】:

    标签: sql-server asp.net-mvc entity-framework


    【解决方案1】:

    不要使用DropCreateDatabaseIfModelChanges&lt;TContext&gt; 作为您的IDatabaseInitializer&lt;TContext&gt;,而是使用MigrateDatabaseToLatestVersion&lt;TContext,TMigrationsConfiguration&gt;,这将确定您的DbContext 中的更改,然后更新您现有的数据库以兼容。

    下面是如何实现MigrateDatabaseToLatestVersion 初始化器的示例:

    namespace Tasks.Models
    {
        public sealed class TaskDBConfiguration : DbMigrationsConfiguration<TasksContext>
        {
            public TaskDBConfiguration()
            {
                AutomaticMigrationsEnabled = true;
                AutomaticMigrationDataLossAllowed = false;
            }
    
            protected override void Seed(TasksContext context)
            {
                var projects = new List<Projects>
                {
                    new Projects { Title = "proTitle", Describe = "proDescribe" },
                };
    
                projects.ForEach(p => context.Projects.Add(p));
    
                context.SaveChanges();
    
                base.Seed(context);
            }
        }
    
        public class TasksContext : DbContext
        {
            public TasksContext() : base("name=TaskDB")
            {
                Database.SetInitializer<TasksContext>(
                  new MigrateDatabaseToLatestVersion<TasksContext, TaskDBConfiguration>()
                );
            }
    
            public DbSet<Task> Task { get; set; }
            public DbSet<Projects> Projects { set; get; }
        }
    }
    

    【讨论】:

    • 那么,我可以在这个表格中使用“种子”吗?
    • 出现错误:您的项目表已存在。我是不是做错了什么?
    • 我更新了我的解决方案以包含 Seed 方法,并将初始化程序的名称移回 DbContext 构造函数。你仍然收到错误吗?如果是这样,您可以将其添加到 cmets 中吗?
    • 我有“System.Data.SqlClient.SqlException:'数据库中已经有一个名为'Projects'的对象。'”错误。
    • 尝试在Package Manager Console 中运行Add-Migration Initial -IgnoreChanges。在运行命令之前,请确保将包含 DbContext 的项目选为“默认项目”。
    猜你喜欢
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多