2013-11-22 56 views
0

我正在使用asp.net mvc4,c#和Entity Framework 5.我試圖創建一個用戶並將角色分配給用戶,同時使用簡單的會員(數據庫第一種方法),但得到以下錯誤在Roles.AddUserToRole("nuser", "Admin");使用SimpleMembership的AddUserToRole時出現錯誤:INSERT語句與FOREIGN KEY約束衝突

INSERT語句衝突與外鍵約束 「FK_webpages_UsersInRoles_webpages_Roles」。衝突發生在 數據庫「DbClick2Eat」,表「dbo.webpages_Roles」,列'RoleId'。 該聲明已被終止。

這裏是我的代碼: -

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult CreateUserByAdmin(RegisterModel register, string role) 
     { 
      try 
      { 
       if (Roles.RoleExists(role)) 
       { 
        var model = register ?? new RegisterModel(); 
        WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
        if (WebSecurity.UserExists(model.UserName)) 
         Roles.AddUserToRole("admin1", "Admin"); 
       } 
       else 
        ModelState.AddModelError("NoRole", "Please select a role."); 

       var roles = Roles.GetAllRoles().ToList(); 
       ViewBag.DeliveryArea = new SelectList(roles.Select(x => new { Value = x, Text = x }), "Value", "Text"); 
       return View(); 
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", AccountController.ErrorCodeToString(e.StatusCode)); 
      } 
      return View(); 
     } 

DB模式

CREATE TABLE [dbo].[webpages_Roles](
    [RoleId] [int] IDENTITY(1,1) NOT NULL, 
    [RoleName] [nvarchar](256) NOT NULL, 
CONSTRAINT [PK_webpages_Roles] PRIMARY KEY CLUSTERED 
(
    [RoleId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[webpages_UsersInRoles](
    [RoleId] [int] NOT NULL, 
    [UserId] [int] NOT NULL, 
CONSTRAINT [PK_webpages_UsersInRoles] PRIMARY KEY NONCLUSTERED 
(
    [RoleId] ASC, 
    [UserId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[webpages_UsersInRoles] WITH CHECK ADD CONSTRAINT [FK_webpages_UsersInRoles_UserProfile] FOREIGN KEY([UserId]) 
REFERENCES [dbo].[UserProfile] ([UserId]) 
GO 
ALTER TABLE [dbo].[webpages_UsersInRoles] CHECK CONSTRAINT [FK_webpages_UsersInRoles_UserProfile] 
GO 
ALTER TABLE [dbo].[webpages_UsersInRoles] WITH CHECK ADD CONSTRAINT [FK_webpages_UsersInRoles_webpages_Roles] FOREIGN KEY([RoleId]) 
REFERENCES [dbo].[webpages_Roles] ([RoleId]) 
GO 
ALTER TABLE [dbo].[webpages_UsersInRoles] CHECK CONSTRAINT [FK_webpages_UsersInRoles_webpages_Roles] 

- > 「管理」 是一個角色名

角色ID = 1,角色名=管理員

「管理」 角色在table.I存在無法修復它...需要幫助

+1

請您提供角色表(DB計劃和管理記錄)以獲取更多信息? –

+0

@stefchri,謝謝你的回覆。我已經添加了數據庫模式。 – NeoDeveloper

回答

1

在生產線:

if (WebSecurity.UserExists(model.UserName)) roles.AddUserToRole("admin1", "Admin") 

你設置 「ADMIN1」 上purpous硬編碼?因爲如果你這樣做了,這可能是你得到外鍵錯誤的原因,因爲這個組合可能已經在數據庫中了。

因此改變這:

if (WebSecurity.UserExists(model.UserName)) roles.AddUserToRole(model.Username, "Admin") 

應該可以解決這個問題。

在上下文CreateUserByAdmin的旁邊,我不確定你要做什麼。 您是否想通過管理員或必須成爲管理員的用戶將用戶添加到數據庫?

更新

你能更改這樣的代碼? 嘗試 {

  var model = register ?? new RegisterModel(); 
      if (!WebSecurity.UserExists(model.UserName)) 
      { 
       WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
      } 
      if (Roles.RoleExists(role)) 
      { 
       Roles.AddUserToRole(model.UserName, role); 
      } 
      else ModelState.AddModelError("NoRole", "Please select a role."); 

      var roles = Roles.GetAllRoles().ToList(); 
      ViewBag.DeliveryArea = new SelectList(roles.Select(x => new { Value = x, Text = x }), "Value", "Text"); 
      return View(); 
     } 
     catch (MembershipCreateUserException e) 
     { 
      ModelState.AddModelError("", AccountController.ErrorCodeToString(e.StatusCode)); 
     } 
     return View(); 

這樣,我們至少排除在用戶已有的FK錯誤。 如果這不起作用,請您包括整個異常堆棧?

+0

感謝您的回覆, 1.最初我使用以下代碼 //model.UserName和角色來自視圖 Roles.AddUserToRole(model.UserName,role); 2.我可以通過使用DBContext保存數據,但需要知道爲什麼會員創建問題 – NeoDeveloper

0

交換訂單UserIdRoleIdwebpages_UsersInRoles表中。 UserId應該是第一列。

+0

thnx它爲我工作 – NeoDeveloper

0

如果您使用的是SimpleMembershp,那麼您使用的是WebMatrix.WebData.SimpleRoleProvider。如果您查看此類的定義,則沒有定義方法AddUserToRole,我不確定使用它會得到什麼樣的行爲。此方法適用於您的原因是因爲您正在使用System.Web.Security。角色而不是將其轉換爲使用的實際提供商,即SimpleRoleProvider。呃,frustrations of the provider model。使用SimpleMembership時,這是安全的方法。

var roles = (WebMatrix.WebData.SimpleRoleProvider)Roles.Provider; 
if (!roles.GetRolesForUser(model.UserName).Contains("Admin")) 
{ 
    roles.AddUsersToRoles(new[] { model.UserName }, new[] { "Admin" }); 
} 

在您的代碼中,您只是在將用戶映射到角色之前檢查用戶是否存在。你真正想要檢查的是,在將用戶添加到角色之前,映射是否已經存在,如上面的代碼片段所示。這將消除任何外鍵違規。

相關問題