设置复杂属性 - 回填数据库的默认值
本文关键字:数据库 默认值 复杂 属性 设置 | 更新日期: 2023-09-27 17:55:18
我有一个使用代码优先迁移的MVC站点,其中包含一个名为"Organisation"的对象,如下所示:
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; }
}
我正在尝试为我网站上的每个区域实现用户权限。因此,上面新添加了权限属性,并且是用户权限类型的对象:
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 中创建了一个列。每种权限类型(Permissions_Contacts、Permissions_Messages等)的组织表。
然而,该数据库已经有许多组织,我想知道是否有办法强加默认值。如果我现在更新我的数据库,所有权限都将为 0(锁定),但是我希望每个权限类别的默认值不同,例如联系人/消息/组的管理员权限和数据锁定权限,因为数据将在用户请求时
设置。我将很快向创建组织的网站的管理层添加功能,并使所有区域都必须选择用户权限,但我不希望返回并手动更改现有组织的所有权限作为我的默认值。
有没有办法自动为数据库中的现有组织强加这些默认值?
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
}
}
根据评论:
为了填充现在与您的模型不同步的现有数据,您需要更新迁移脚本以填充"up"脚本中的新属性(我认为"down"脚本不需要修改)。
基本上,在 up 脚本中,您可以编写更新 sql 语句,或者通过上下文循环访问对象,以更强大的类型方式操作它们的值。
下面是有关迁移脚本入门的一些信息:
http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application
我认为您的 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();
}