【发布时间】:2014-05-04 11:10:48
【问题描述】:
这是 MVC 5/EF6。所以我有以下课程:
public class User : IdentityUser
{
public User()
{
Levels = new List<Level>();
}
[Required, MaxLength(200)]
public string FirstName { get; set; }
[Required, MaxLength(200)]
public string LastName { get; set; }
public virtual ICollection<Level> Levels { get; set; }
}
和
public class Level
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
除了常规的 MVC5 成员表之外,它还创建了 2 个:Levels 和 UserLevels(带有 User_Id 和 Level_Id 列)。 Levels 表有一个静态数据(即 1 - 优秀,2 - 好等)并且是一种库,我不想在这个表中插入。
我正在尝试做的是当用户在网站上注册并选择它将继续并从数据库中检索它的级别时,以便UserLevels 表填充新的UserID 并选择LevelID。这是我的代码:
Level level = DBContext.Levels.Where(s => s.Name == model.Level.Name).SingleOrDefault();
if (level == null)
ModelState.AddModelError("", "Invalid Level.");
if (ModelState.IsValid)
{
var user = new User() {
UserName = model.UserName,
FirstName = model.FirstName,
LastName = model.LastName
};
user.Levels.Add(level);
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
return View(model);
它在这一行抛出异常:An entity object cannot be referenced by multiple instances of IEntityChangeTracker..
var result = await UserManager.CreateAsync(user, model.Password);
我猜这与试图将其中已经存在的关卡插入 Levels 表有关吗?当然它可能是别的东西......有什么建议吗?提前致谢!
【问题讨论】:
-
DBContext来自哪里? -
这是帐户控制器
MyDBContext DBContext = new MyDBContext();中的全局变量,而实际的上下文类是这样的:public class MyDBContext : IdentityDbContext<User>{ public MyDBContext() : base("DefaultConnection") { } public DbSet<Level> Levels {get; set;} } -
这个异常仅仅意味着你的
Level被多个DbContexts跟踪。您用来从中获取关卡的那个,以及由UserManager实例化的那个。您的UserManager是如何配置的? -
谢谢!我没有以任何方式配置它,开箱即用的东西就是我正在使用的东西。是否有解决方法来确保我对两者都使用单个 DbContext?奇怪的是我只使用
DBContext从用户选择的数据库中检索关卡,我并没有真正使用它来保存对数据库或任何东西的更改,至少不在这个控制器中。
标签: c# asp.net-mvc-5 entity-framework-6 asp.net-identity-2