EF6 中的种子方法不覆盖值

Seed method in EF6 without overwriting values

我正在重写项目中的 DbMigrationConfiguration 种子方法以获取用户权限的一些默认数据。目前,每次迁移时我的数据都会被覆盖运行。

这是我目前正在做的事情:

protected override void Seed(MyDbContext dbContext)
{
    List<Permission> permissions = PermissionFactory.CreatePermissions();
    dbContext.Permissions.AddOrUpdate(permissions);            
}

和权限实体:

public class Permission
{
    public Guid Id { get; set; }
    public string Role { get; set; }
    public bool Allow { get; set; }
}

我希望该数据只写入一次,并且只添加新条目,前提是它们的 ID 与 table 中当前的 ID 不同。我该怎么做才能避免每次迁移时都重置我的权限 运行?

我想你想要的是AddIfNotExists?

public static class EntityFrameworkExtension
{
    public static void AddIfNotExists<T>(
        this IDbSet<T> t, Func<T, object> func, params T[] objectsToAdd) 
        where T : class
    {
        foreach (var obj in objectsToAdd
            .Where(obj => !t.Select(func).Contains(func.Invoke(obj))))
                t.Add(obj);
    }
}

所以你可以用

调用它
dbContext.Permissions.AddIfNotExists(p=>p.Id,
    new Permission{/*values*/},
    new Permission{/*values*/},
    new Permission{/*values*/}
);

只会添加新条目