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*/}
);
只会添加新条目
我正在重写项目中的 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*/}
);
只会添加新条目