加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC 5身份应用程序用户作为外键

发布时间:2020-12-15 18:59:07 所属栏目:asp.Net 来源:网络整理
导读:我知道Visual Studio 2013明天正式推出,希望会有更多的随附文档,特别是它关于ASP.NET身份.我在跳的同时有人可以帮助我. 我所要做的就是将当前登录用户的UserID作为外键访问我称为Retailer的表. 首先是我得到的错误消息 An entity object cannot be reference
我知道Visual Studio 2013明天正式推出,希望会有更多的随附文档,特别是它关于ASP.NET身份.我在跳的同时有人可以帮助我.

我所要做的就是将当前登录用户的UserID作为外键访问我称为Retailer的表.

首先是我得到的错误消息

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

这是我的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; }

}

以下是Entity Framework CodeFirst如何从上面的类创建表:

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);

这是我试图在我的控制器中将记录保存到此表的位置:

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

并且为了完全公开,这里是一些堆栈跟踪:

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 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:UsersValentineDocumentsVisual Studio 2013ProjectsValueCardProjectPremiumValueCardPremium.WebControllersRetailerController.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使用它自己的DbContext从数据库加载数据.您将需要从用于添加引用的相同dbContext中检索用户.就像是:
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");

当然,您必须使用实际适用于您的模型和DbContext的任何方法从数据库中检索用户.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读