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

时间:2015-06-10 12:28:29

标签: c# entity-framework ef-code-first ef-migrations

我有一个使用代码优先迁移的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,但我不想重新访问并手动更改所有权限。现有的组织是我的默认组织。

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

1 个答案:

答案 0 :(得分:1)

您是否可以在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
    }
}

基于评论:

为了填充现在与您的模型不同步的现有数据,您需要更新迁移脚本以填充“&#34; up&#34;”中的新属性。脚本(&#34; down&#34;脚本不需要修改我不会想到。)

基本上在您的脚本中,您可以编写更新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();
}