代码之家  ›  专栏  ›  技术社区  ›  Kenny Lucero

EF6 System.Data.Entity.Migrations.AddOrUpdate的数据种子设定问题

  •  1
  • Kenny Lucero  · 技术社区  · 6 年前

    SQL Server 2016开发人员版, .Net 4.5.2版

    我遇到了一些问题 AddOrUpdate 扩展方法。 根据我对方法的理解,应该使用lambda表达式定义用于确定是否要更新或添加记录的唯一字段。但我的似乎忽略了这一点,每次都试图增加。本例使用的是标识类AspNetRole,但上下文中的所有实体都会出现相同的问题。

    public class UserSeeder
    {    
        public static void Seed(MyIdentityDbContext context)
        {
    
    
            HashSet<AspNetRole> roles = new HashSet<AspNetRole>();
    
            AspNetRole systemAdmin = new AspNetRole() { Id = "269E684F-9542-4F6A-8029-7516AA2ECD61", Name = "System Admin" };
            AspNetRole admin = new AspNetRole() { Id = "BE70FDF9-FCD5-4894-AE71-DA324A7D751E", Name = "Administrator" };
            AspNetRole normalUser = new AspNetRole() { Id = "D9C66DC0-190F-463A-88B0-8E1E4ED96BAF", Name = "User" };
    
            roles.Add(systemAdmin);
            roles.Add(admin);
            roles.Add(normalUser);
    
            foreach (AspNetRole role in roles)
            {
                context.Roles.AddOrUpdate(r =>r.Id, role);
                //context.Roles.AddOrUpdate(role);
                //both throw same error
            }
            context.SaveChanges();
        }
    }
    

    以及通过启用迁移生成的Configuration.cs文件。

    //  This method will be called after migrating to the latest version.
    protected override void Seed(MyIdentityDbContext context)
    {
        UserSeeder.Seed(context);
        base.Seed(context);
    }
    

    这是使用lambda调用和传入对象时出现的错误。我怀疑有一些配置我没有正确设置,因为这是上周的工作,当我检查git时,没有对DAL项目的任何文件进行任何更改。

    此外,数据库是最新的,应用程序在运行时不会抛出任何数据访问错误,因此连接良好,模型处于同步状态。我们只是不能让seed方法像示例显示的那样工作。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ahmed Ghoniem    6 年前

    您可以检查角色是否已存在(如果存在),然后更新else添加新角色

        public static void Seed(MyIdentityDbContext context)
        {
            HashSet<AspNetRole> roles = new HashSet<AspNetRole>();
            AspNetRole systemAdmin = new AspNetRole() { Id = "269E684F-9542-4F6A-8029-7516AA2ECD61", Name = "System Admin" };
            AspNetRole admin = new AspNetRole() { Id = "BE70FDF9-FCD5-4894-AE71-DA324A7D751E", Name = "Administrator" };
            AspNetRole normalUser = new AspNetRole() { Id = "D9C66DC0-190F-463A-88B0-8E1E4ED96BAF", Name = "User" };
    
            roles.Add(systemAdmin);
            roles.Add(admin);
            roles.Add(normalUser);
    
            foreach (AspNetRole role in roles)
            {
                AspNetRole dbrole = context.Roles.FirstOrDefault(r => r.Id.ToLower() == role.Id.ToLower());
                if (dbrole != null)
                {
                    dbrole.Name = role.Name;
                    context.Roles.AddOrUpdate(dbrole);
                }
                else
                {
                    context.Roles.Add(role);
                }           
            }
            context.SaveChanges();
        }