微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理实体框架模型而不会丢失生产部署中的先前数据?

如何解决如何处理实体框架模型而不会丢失生产部署中的先前数据?

最初我使用 EF 6 代码优先方法在 LocalDB(基于服务的数据库)中创建表。代码是:

namespace WindowsFormsApp2
{
   public class MyDBContext : DbContext
   {
    public MyDBContext() : base("name=strCon")
    {
        AppDomain.CurrentDomain.SetData("DataDirectory",Path.Combine(AppDomain.CurrentDomain.BaseDirectory,""));
        Database.Setinitializer<MyDBContext>(new DropCreateDatabaseIfModelChanges<MyDBContext>());
        //Database.Setinitializer<MyDBContext>(null);
        //Database.Setinitializer<MyDBContext>(new CreateDatabaseIfNotExists<MyDBContext>());
    }
    public DbSet<Assets> Assets { get; set; }
}
}

App.config 中 LocalDB 的连接字符串

 <connectionStrings>
 <add name="strCon" connectionString="Data Source=(LocalDB)\MSsqlLocalDB;AttachDbFilename=|DataDirectory|\AppDB.mdf;Integrated Security=True;Connect Timeout=30" providerName="System.Data.sqlClient" />
 </connectionStrings>

我的目标是在客户端机器上部署(发布)最新的模型更改,而不会丢失表中的先前数据。数据库迁移应该以编程方式执行。但是数据库初始值设定项 DropCreateDatabaseIfModelChanges数据库上是 DELETE、RECREATING。 有没有可能EF6还没有自动处理这种基本的模型变化而不删除,重新创建?

解决方法

您正在使用 DropCreateDatabaseIfModelChanges 初始化您的上下文。顾名思义,如果模型发生变化,它会完全删除数据库并重新创建它。如果这不是您想要的操作,您应该使用类似 CreateDatabaseIfNotExists 的方法来维护现有数据。

,

解决办法如下:

Entity Framework 中的自动迁移应自动执行模型更改,而不会丢失开发或生产或 LocalDB 中的数据。

namespace WindowsFormsApp3
{
public class MyDBContext:DbContext
{
    public MyDBContext() : base("name=strCon") {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext,WindowsFormsApp3.Migrations.Configuration>());
    }
    public DbSet<Employee> Employee { get; set; }
 }
}

您应该在包管理控制台中运行 Enable-Migrations 以生成 Configuration.cs 文件。

这是我的 Configuration.cs 文件中的代码。

namespace WindowsFormsApp3.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;

internal sealed class Configuration : DbMigrationsConfiguration<WindowsFormsApp3.MyDBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }

    protected override void Seed(WindowsFormsApp3.MyDBContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data.
    }
 }
}

对于 Service-based database,您需要将 .mdf 文件属性 Copy to output DirectoryCopy if newer 设置为 Copy always

App.config 文件中的连接字符串:

<connectionStrings>
    <add name="strCon" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\WinForms3.mdf;Integrated Security=True;Connect Timeout=30" providerName="System.Data.SqlClient" />
</connectionStrings>

现在,您可以在模型类中添加或修改实体。您无需在包管理器控制台中运行任何命令。

重要

请注意,您必须在 Configuration 类构造函数中将 AutomaticMigrationDataLossAllowed 设置为 true,连同 AutomaticMigrationsEnabled = true; 这两个选项应该处理相应列异常种类或场景中的数据丢失。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。