设置复杂属性 - 回填数据库的默认值

本文关键字:数据库 默认值 复杂 属性 设置 | 更新日期: 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(锁定),但是我希望每个权限类别的默认值不同,例如联系人/消息/组的管理员权限和数据锁定权限,因为数据将在用户请求时

设置。

我将很快向创建组织的网站的管理层添加功能,并使所有区域都必须选择用户权限,但我不希望返回并手动更改现有组织的所有权限作为我的默认值。

有没有办法自动为数据库中的现有组织强加这些默认值?

设置复杂属性 - 回填数据库的默认值

你能在

OrganisationUserPermissions对象的构造函数中设置默认权限吗?

像这样:

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();
}