2013-10-11 36 views
1

我在種子方法中創建了一些數據。我創建了幾個用戶的幾個權限(角色)Roles.AddUserToRole在給定相同用戶名的情況下找到不同的userId

WebSecurity.InitializeDatabaseConnection("MibContext", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
Roles.CreateRole(Constants.Roles.Administrator); 
Roles.CreateRole(Constants.Roles.ContentManager); 
Roles.CreateRole(Constants.Roles.KeyAccountManager); 

然後我有變量的用戶名(以避免任何錯字可能性)

var adminusername = "[email protected]"; 
var userusername = "[email protected]"; 

我通過EF和創建USERPROFILE紀錄的UnitOfWork模式

var admin = new UserProfile 
     { 
      FirstName = "Admin", 
      LastName = "Account", 
      UserName = adminusername 
     }; 
unitOfWork.UserRepository.Insert(admin); 
unitOfWork.Save(); 

然後創建用戶會員賬號,並分配角色:

WebSecurity.CreateAccount(adminusername, "123456"); 
WebSecurity.CreateAccount(userusername, "123456"); 

Roles.AddUserToRole(userusername, Constants.Roles.Administrator); 
Roles.AddUserToRole(userusername, Constants.Roles.KeyAccountManager); 

最後的角色命令導致錯誤,UsersInRoles和UserProfile之間的外鍵衝突。這是非常奇怪的,因爲它可以將角色映射到第一個用戶(這是管理員用戶第一次使用,但想要查看它是否可以爲該用戶創建權限,它會這樣做)

然後,我刪除了外鍵約束來查看發生了什麼,並在其中放置了3。通過重複測試但添加第4個角色,似乎(用戶名,角色)參數是錯誤的方法!?!?新角色的Id = 4,並重複測試,這是它放在UserId列。

RoleId UserId 
2  1 
2  4 
NULL  NULL 

角色配置:

<roleManager enabled="true" defaultProvider="SimpleRoleProvider"> 
    <providers> 
    <clear/> 
    <add name="SimpleRoleProvider" 
     type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" /> 
    </providers> 
</roleManager> 

我缺少的東西?

+0

SQL事件探查顯示了此命令: INSERT INTO webpages_UsersInRoles VALUES(4,1); 這是我放入方法的順序,但該表首先由ROLE創建,而不是用戶。如果他們已經把字段名稱,它會很好地工作。 – Simon

+0

很高興你在這裏留下了這個問題並回答了它。爲了AddUserToRole爲什麼會拋出重要違規,我在4個小時的追捕之後。如果你可以更新密鑰違規問題的標題,那將會很好,因爲那是我首先搜索的內容,比如「AddUsersToRole引發密鑰違規異常」或類似的內容? – Mateusz

回答

1

webpages_UsersInRole表中的字段順序顯然非常重要。

我看了一下映射,看看那裏是什麼,並且在ROLES表格一側定義了關係(很多 - >很多)。我將映射交換到用戶端,現在它正常工作。這是我在UserProfile對象上使用的映射。

// Relationships 
     this.HasMany(t => t.webpages_Roles) 
      .WithMany(t => t.UserProfiles) 
      .Map(m => 
      { 
       m.ToTable("webpages_UsersInRoles"); 
       m.MapRightKey("RoleId"); 
       m.MapLeftKey("UserId"); 
      }); 

真的,角色提供者不應該假設列的順序,並應指定他們的名字。至少我仍然可以通過這種方式修改映射來使用默認功能。這是SQL相當差:

INSERT INTO webpages_UsersInRoles VALUES (4,1); 
相關問題