2015-12-14 57 views
1

我已經閱讀了很多關於這個錯誤的帖子,大多數人都說它是關於在AppConfig中的connectionstring,它不應該是EF連接字符串,而應該是普通的舊的sql連接字符串。我已經確定了的ConnectionString是正確的,我使用的是SQL連接字符串,但我仍然不斷收到錯誤... 這是代碼實體類型ApplicationUser不是模型的一部分,當添加用戶時引發當前上下文

public void RegisterDealer(RegisterAdministrator model) 
    { 
     var user = new ApplicationUser { UserName = model.administratorName, Email = model.administratorEmail, AccountNumber = model.AccountNumber, LoginUserName = model.LoginUserName }; 

     ApplicationDbContext dbc = new ApplicationDbContext(); 

     PasswordHasher MyPasswordHash = new PasswordHasher(); 



     user.PasswordHash = MyPasswordHash.HashPassword(model.administratorPassword); 
     user.SecurityStamp = Guid.NewGuid().ToString(); 
     user.LockoutEnabled = true; 
     user.AccountNumber = "1"; 
     user.IsActive = true; 


     dbc.Users.Add(user); 
     dbc.SaveChanges(); 

     AdvancewareIdentity ICE = new AdvancewareIdentity(); 
     AspNetUserRole AUR = new AspNetUserRole(); 

     AUR.UserId = user.Id; 
     // Dealer RoleID 
     // 8870ccb1-8ced-4703-a6bd-303c5ff5faf7 

     AUR.RoleId = "8870ccb1-8ced-4703-a6bd-303c5ff5faf7"; 

     ICE.AspNetUserRoles.Add(AUR); 
     ICE.SaveChanges(); 


     //UserManager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + id + "\">here</a>"); 
    } 

的錯誤是正確的

dbc.Users.Add(user); 

堆棧跟蹤是這樣的..

at System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType) 
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity) 
at System.Data.Entity.DbSet`1.Add(TEntity entity) 
at AdvanceWareDAL.Authentication.AdministrationAccountController.RegisterDealer(RegisterAdministrator model) in c:\AdvanceWareRevision\AdvanceWareDAL\Authentication\AdministrationAccountController.cs:line 306 
at AdvanceWareDAL.Authentication.OQOEDAL.AddNewDealer(NewDealer dealer) in c:\AdvanceWareRevision\AdvanceWareDAL\Models\OQOEDAL.cs:line 599 
at AdvanceWareDAL.OQOEAdminstrationDAL.AddNewDealerFromAdministration(NewDealer dealer, String loggedinuser) in c:\AdvanceWareRevision\AdvanceWareDAL\OQOEAdminstrationDAL.cs:line 96 
at AdvanceWareMVC.Controllers.AdministrationController.AddNewDealer(NewDealer dealer) in c:\AdvanceWareRevision\AdvanceWareMVC\Controllers\AdministrationController.cs:line 133 
at lambda_method(Closure , ControllerBase , Object[]) 
at System.Web.Mvc.ActionMethodDispatcher.<>c__DisplayClass1.<WrapVoidAction>b__0(ControllerBase controller, Object[] parameters) 
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod() 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() 
at System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag) 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() 

有誰看到,我失去了一些東西或一個想法在尋找什麼,在解決這個問題?

編輯

這裏是通過的UserManager的的DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() 
      : base("AdvancewareIdentity", throwIfV1Schema: false) 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 
    } 
+0

你可以發佈ApplicationDbContext的代碼嗎? – Lidaranis

+0

您的ApplicationDbContext是否繼承IdentityDbContext? –

+0

@Lidaranis,我添加了DbContext代碼 – Chris

回答

0

創作要容易得多代碼(具體原因你不?)。以下是我如何解決這個問題:

public void RegisterDealer(RegisterAdministrator model) 
{ 
    ApplicationDbContext dbc = new ApplicationDbContext(); 

    var user = new ApplicationUser { UserName = model.administratorName, Email = model.administratorEmail, AccountNumber = model.AccountNumber, LoginUserName = model.LoginUserName }; 
    user.SecurityStamp = Guid.NewGuid().ToString(); 
    user.LockoutEnabled = true; 
    user.AccountNumber = "1"; 
    user.IsActive = true; 

    var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(dbc)); 

    UserManager.Create(user, "PasswordWithoutHash"); 
    dbc.SaveChanges(); 

    // Retrieve user to add to role 
    var newUser = dbc.Users.FirstOrDefault(x => x.Email == user.Email)  

    // If user created, add to the role 
    if(newUser != null) 
    { 
     userManager.AddToRole(newUser.Id, "RoleName"); 
     dbc.SaveChanges(); 
    } 

    //UserManager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + id + "\">here</a>"); 
} 
+0

「PasswordWithoutHash」,密碼如何散列? – Chris

+0

由核心框架中已存在的默認PasswordHasher。 –

0

你的堆棧跟蹤是一團糟。看起來你實際上是通過中的AddNewDealer操作實現的,並且從那裏開始,您正在創建一個AdministrationAccountController實例,以便首先通過跳過DAL的方式調用RegisterDealer。這至少意味着你在這裏沒有分離的問題,這可能是問題的一大部分。

此外,有關的是,沒有提及您的上下文來自何處。每個人都有自己的上下文版本嗎?似乎沒有任何東西允許注入依賴項,所以我會這樣認爲。這也是有問題的。

這就是說,根據錯誤以及您發佈的ApplicationDbContext,我最好的猜測是您實際上有兩個不同的上下文類,您的應用程序正在使用,身份用戶是一個,而您的其他人應用程序數據在其他。該錯誤是嘗試在完全不同的上下文中將用戶實例與其他實例(可能爲Dealer)關聯的結果。通常情況下,實體框架會嘗試從您自己身上拯救您,並將用戶附加到其他上下文中,從而需要進行遷移。由於沒有發生,我假設你的第二個上下文是針對已經禁用了遷移的現有數據庫。

長短,任何需要相互關聯的實體都需要駐留在同一個上下文類中。你不能混合搭配。如果你不能合併上下文,那麼你可以做的最好的就是存儲用戶ID並使用它在你的Identity上下文中手動查找用戶;您無法創建真正的外鍵或具有導航屬性。

+0

一旦我做了整理和重組,一切都陷入了混亂,在此之前,一切正常,你是正確的我正在使用2個不同的上下文類。當你在我的Framework.UI項目中使用AccountController登錄它時,以及當我去註冊一個新的經銷商時,這在DAL中完成,它在一個名爲Authentication的文件夾中保存相同的Identity類。我現在知道它是一個巨大的混亂,我不能從頭開始重寫整個項目,所以我需要使用已完成的工作 – Chris

+0

當我將DAL類分成兩個不同的DAL類時,一個名爲Admin,另一個名爲Orders ,那麼一切都變糟了 – Chris

+1

你需要一個上下文爲你的應用程序。可以在類庫中,但不能在多個類庫中使用。你必須選擇一個成爲數據庫的主人。 –

相關問題