2015-06-10 93 views
2

我有一个MVC站点使用包含所谓的“组织”的对象,如下代码首先迁移:设置默认值 - 回填数据库

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会在每个权限类型(Permissions_Contacts,Permissions_Messages等)的dbo.Organisations表中创建一个列。

数据库但已经有很多机构,我想知道是否有征收默认的方式。如果我现在更新了我的数据库,所有权限都将为0(锁定),但是我希望每个权限类别的默认值不同。联系人/消息/组的管理员权限和数据的锁定权限,因为数据将在用户请求时进行设置。

我很快将功能添加到创建组织的站点的管理层,并且为所有区域选择UserPermissions为强制选项,但我不希望返回并手动更改所有权限现有的组织是我的默认设置。

有自动施加这些默认的数据库中现有的组织方式?

+1

您是否尝试过使用此https://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute%28v=vs.110%29。aspx,我不知道这是否会工作,虽然 – George

+0

谢谢,这很有趣,我从来没有见过这个属性。我会尝试在属性中添加'[DefaultValue(typeof(PermissionLevels),PermissionLevels.Administrator)]'标签,看看它是否已经被强制执行。我假设在此之后获得并设置工作正常? – JonnyKnottsvill

+0

应该没问题,正如我在第一条评论中所说的那样,我不知道它是否会将当前数据库编辑为这些值。 – George

回答

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 
    } 
} 

基于评论:

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

基本上在了脚本,你可以写更新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

我觉得你最多方法可以修改为有这样的事情接近尾声:

using (MyContext context = new MyContext) 
{ 
    var orgs = context.Organisation; 
    foreach (Organization org in orgs) 
    { 
     org.Permissions = new UserPermissions() 
     { 
      Contacts = PermissionLevel.Locked, 
      // etc 
     } 
    } 

    context.SaveChanges(); 
} 
+0

这将有助于添加新组织,这很好,但我更努力避免编辑已在我的数据库中的那些组织的权限属性....因为他们目前没有权限,我只是添加了它,更新数据库的权限将被视为null,并且全部为0(锁定)。 – JonnyKnottsvill

+0

因此,您的问题具体是如何回填数据,而不是如何实施默认前进?你使用什么EF模型?代码第一?数据库第一?模型第一?我认为这可能会影响用于预填现有数据的解决方案类型。 – Kritner

+0

对不起,我会编辑以使情况更加清晰。我正在使用代码第一次迁移。 – JonnyKnottsvill