I know Visual Studio 2013 launches officially tomorrow and hopefully there will be more accompanying documentation especially as it regards ASP.NET Identity. I am hopping that in the meantime someone can help me out.
All I am trying to do is to get the UserID of the currently logged in user as foreign key to a table I called Retailer.
First here is the error message I am getting
An entity object cannot be referenced by 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; }
}
Here is how Entity Framework CodeFirst created the table from the above 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 here is where I am trying to save a record to 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 of the 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
UserManager uses it's own DbContext to load data from the database. You will need to retrieve the user from the same dbContext that you use to add a reference to. Something like:
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 DB using whatever method actually works for your models and DbContext.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With