我有一个使用代码优先迁移的MVC站点,其中包含一个名为“Organization”的对象,如下所示:
public class Organisation
{
public int Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public virtual ICollection<Contact> Contacts { get; set; }
public virtual ICollection<Location> Locations { get; set; }
public UserPermissions Permissions { get; set; }
}
我正在尝试为我网站上的每个区域实现用户权限。因此,上面新添加了权限属性,并且是UserPermissions类型的对象:
public class UserPermissions
{
public PermissionLevel Contacts { get; set; }
public PermissionLevel Messages { get; set; }
public PermissionLevel Groups { get; set; }
public PermissionLevel Data { get; set; }
}
其中 PermissionLevels 是枚举,定义为:
public enum PermissionLevel
{
Locked = 0,
View = 1,
Administrator = 2
}
我觉得这个实现的结构很好,在添加迁移后,EF会在我的dbo.Organisations表中为每个权限类型创建一个列(Permissions_Contacts,Permissions_Messages等)。
然而,数据库已经有很多组织,我想知道是否存在强加默认值的方法。如果我现在更新了我的数据库所有权限都是0(锁定),但我希望每个权限类别的默认值不同,例如联系人/消息/组的管理员权限和数据的锁定权限,因为数据将在用户请求时设置。
我很快就会在创建组织的网站的管理层添加功能,并且必须为所有区域选择UserPermissions,但我不想重新访问并手动更改所有权限。现有的组织是我的默认组织。
是否有办法自动为数据库中的现有组织强加这些默认值?
答案 0 :(得分:1)
您是否可以在Organisation
或UserPermissions
对象的构造函数中设置默认权限?
类似的东西:
public UserPermissions()
{
Contacts = PermissionLevel.Locked;
// etc
}
或
public Organisation()
{
this.Permissions = new UserPermissions();
if (this.Id == 0) // new object not yet persisted
{
this.Permissions.Contacts = PermissionLevel.Locked;
// etc
}
}
基于评论:
为了填充现在与您的模型不同步的现有数据,您需要更新迁移脚本以填充“&#34; up&#34;”中的新属性。脚本(&#34; down&#34;脚本不需要修改我不会想到。)
基本上在您的脚本中,您可以编写更新sql语句,也可以通过上下文遍历对象,以更强类型的方式操作它们的值。
以下是有关迁移脚本入门的一些信息:
我认为您的Up方法可以修改为接近结尾:
using (MyContext context = new MyContext)
{
var orgs = context.Organisation;
foreach (Organization org in orgs)
{
org.Permissions = new UserPermissions()
{
Contacts = PermissionLevel.Locked,
// etc
}
}
context.SaveChanges();
}