【问题标题】:EF keep existing data during automatic migrationEF 在自动迁移期间保留现有数据
【发布时间】:2018-03-03 01:31:54
【问题描述】:

我遇到了一个奇怪的问题,每当我对实体的任何一个进行更改时,我的 EF 自动迁移都会从 所有 表中删除所有数据。

我见过类似的question,但是在我的一生中,我无法从我自己的实现中缺少的链接中得出什么。

请注意,该应用程序工作正常,通过 EF 检索数据并将其保存到 mysql 数据库 - 每次我想修改实体时都必须重新创建所有数据,这真是太烦人了。

我正在使用 EF6.0 和 MySql 数据库。


Context.cs

namespace Dock.Models
{
    [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public class DockContext : DbContext
    {
        public DockContext(): base("name=DockContext")
        {
            Database.SetInitializer(new DockInitializer());
        }

        public virtual DbSet<Profile> Profiles { get; set; }
        public virtual DbSet<Dock> Docks { get; set; }
        public virtual DbSet<Crate> Crates { get; set; }
        public virtual DbSet<Subscription> Subscriptions { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

        }
    }
}

Configuration.cs

 internal sealed class Configuration : DbMigrationsConfiguration<DockContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = false;
            SetSqlGenerator("MySql.Data.MySqlClient", new MySqlMigrationSqlGenerator());
            CodeGenerator = new MySqlMigrationCodeGenerator();
        }

        protected override void Seed(DockContext context)
        {
            Profile admin = new Profile {
                NotAPrimaryId = 168879070,
                DisplayName = "Admin101"
            };
            context.Profiles.AddOrUpdate(a => a.NotAPrimaryId , admin);
            context.SaveChanges();
        }
    }

以及实体的 Dock.cs

之一的示例
namespace Dock.Entities
{
    public class Dock
    {
        [Key]
        public int DockId { get; set; }
        public int ProfileId { get; set; }
        public int GameId { get; set; }
        public string GameData { get; set; }
        public bool Active { get; set; }

        // Navigational Properties
        [ForeignKey("CrateId")]
        public virtual List<Crate> Crates { get; set; } = new List<Crate>();
    }
}

【问题讨论】:

  • 我的建议:永远不要在你关心的环境中使用自动迁移。掀起一个概念验证?当然。团队开发、质量保证或生产环境?没有。
  • @EricJ。所以你会建议放弃自动迁移并开始编写我自己的迁移吗?该应用仍在开发中(没有真正的用户数据自动取款机)。感谢您的反馈。
  • EF 将为您创建迁移类。您不必手写它们。 msdn.microsoft.com/en-us/data/jj591621 在我的经验中,当不同的团队成员在不同的时间提交更新时,自动迁移可能会导致问题。我还不得不多次手动编辑生成的基于代码的迁移,这是自动迁移无法做到的
  • 感谢@EricJ 的洞察力。
  • @EricJ。更改为手动迁移为我解决了这个问题,我非常感激。您想发布您的 cmets 作为答案吗? - 他们很有帮助。

标签: c# mysql entity-framework


【解决方案1】:

EF 将create migration classes for you。您不必手写。

当不同的团队成员在不同的时间提交更新时,自动迁移可能会导致问题。

我还不得不多次手动编辑生成的基于代码的迁移,这是自动迁移无法做到的。

我建议切换到手动迁移,以便您可以完全了解和控制迁移过程。

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 2019-02-25
    • 2017-06-24
    • 2013-02-04
    • 2015-06-15
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多