ASP.NET MVC 5 application user as foreign key

I know that Visual Studio 2013 launches officially tomorrow, and I hope there will be more supporting documentation, especially with regard to ASP.NET Identity. I jump, so far someone can help me.

All I'm trying to do is get the UserID of the current user as a foreign key in the table that I called Retailer.

First, here is the error message I get

An entity object cannot reference multiple instances of IEntityChangeTracker.

Here is my POCO :

public class Retailer { [Key] public int RetailerId { get; set; } public string BusinessName { get; set; } public string PhoneNumber { get; set; } public string ManagerName { get; set; } public Enums.Industry Industry { get; set; } public virtual ApplicationUser UserProfile { get; set; } } 

This is how the Entity Framework CodeFirst created a table from the specified class:

 CreateTable( "dbo.Retailers", c => new { RetailerId = c.Int(nullable: false, identity: true), BusinessName = c.String(), PhoneNumber = c.String(), ManagerName = c.String(), Industry = c.Int(nullable: false), UserProfile_Id = c.String(maxLength: 128), }) .PrimaryKey(t => t.RetailerId) .ForeignKey("dbo.AspNetUsers", t => t.UserProfile_Id) .Index(t => t.UserProfile_Id); 

And this is where I am trying to save the record in this table in my controller:

 if (ModelState.IsValid) { var currentUser = await UserManager.FindByIdAsync(User.Identity.GetUserId()); retailer.UserProfile = currentUser; db.Retailers.Add(retailer); await db.SaveChangesAsync(); return RedirectToAction("Index"); } 

And for full disclosure, here is some stack trace:

 InvalidOperationException: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.] System.Data.Entity.Core.Objects.ObjectContext.VerifyContextForAddOrAttach(IEntityWrapper wrappedEntity) +189 System.Data.Entity.Core.Objects.ObjectContext.AddSingleObject(EntitySet entitySet, IEntityWrapper wrappedEntity, String argumentName) +126 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach) +98 System.Data.Entity.Core.Objects.DataClasses.EntityReference.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach) +65 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach) +67 System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach) +341 System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach) +210 System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach) +164 System.Data.Entity.Core.Objects.ObjectContext.AddObject(String entitySetName, Object entity) +520 System.Data.Entity.Internal.Linq.<>c__DisplayClassd.<Add>b__c() +97 System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) +355 System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity) +200 System.Data.Entity.DbSet`1.Add(TEntity entity) +130 ValueCardPremium.Web.Controllers.<Create>d__7.MoveNext() in c:\Users\Valentine\Documents\Visual Studio 2013\Projects\ValueCardProjectPremium\ValueCardPremium.Web\Controllers\RetailerController.cs:70 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 lambda_method(Closure , Task ) +64 
+6
source share
2 answers

UserManager uses its own DbContext to load data from the database. You will need to extract the user from the same dbContext that you use to add the link. Sort of:

 var currentUMUser = await UserManager.FindByIdAsync(User.Identity.GetUserId()); var currentUser = db.Users.Find(currentUMUser.UserID); retailer.UserProfile = currentUser; db.Retailers.Add(retailer); await db.SaveChangesAsync(); return RedirectToAction("Index"); 

Of course, you will have to retrieve the user from your database using any method that really works for your models and DbContext.

+13
source

Add a using statement:

 using Microsoft.AspNet.Identity; 

Then you can get the UserId with:

 var a = User.Identity.GetUserId(); 
0
source

Source: https://habr.com/ru/post/957941/


All Articles