2015-06-10 89 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