我已经处理了好几天
摘要
我正在创建一个社交网站,它将成为另一个Web应用程序的骨干。挂断是指我提交创建组的请求一切顺利,但如果我尝试使用不同的数据再次提交此表单,我会得到DbEntityValidationException
。该例外与ApplicationUser
条目有关。
详情
当我在调试模式下启动应用程序并首次提交组创建表单时,它将成功,将所有实体添加到数据库中作为例外。我已经验证了这一切,看起来很好看。在同一个Debug会话中,我更改表单中的信息,创建另一个组,然后提交表单,这将导致DbEntityValidationException
。
当我尝试插入包含对用户的引用的SocialGroupMemberModel
以及与该组中的用户状态相关的其他详细信息时,该错误与此相关。用户条目被标记为added
,EntityFramework正在尝试插入用户而不是更新。我试图设置导航(用户)并设置ForeignKey(UserId),两者都导致相同的错误。
HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();
ApplicationUserManager
获取用户实体,然后我将其传递给存储库以创建组(在任何一种情况下,传递ID或实体本身都不起作用时间)组创建代码:
var groupInfo = new SocialGroupInfo
{
Created = DateTime.Now,
Description = model.Description,
ShortDescription = model.ShortDescription,
Name = model.Name,
Tags = TagRepo.GetTags(),
Members = new List<SocialGroupMember>()// { member }
};
var groupModel = new SocialGroupModel
{
Slug = model.Slug,
Info = groupInfo
};
Context.SocialGroups.Add(groupModel);
var member = new SocialGroupOwnerModel
{
Joined = DateTime.Now,
UserId = creator
//User = null
//Group = groupInfo
};
groupInfo.Members.Add(member);
//creator.SocialGroups.Add(member);
SaveChanges();
验证错误是:“用户名**已被占用”,因此这让我相信在第二次尝试添加新组时,它会尝试添加新用户。
请询问所需的任何其他信息,谢谢。
答案 0 :(得分:0)
尝试重新选择用户并再次附加,看看它是否有效?
var member = new SocialGroupOwnerModel
{
Joined = DateTime.Now,
UserId = creator
User = UserManager.FindById(creator)
//Group = groupInfo
};
答案 1 :(得分:0)
此问题是由IoC持有对前一个DbContext的引用引起的,不确定原因,但删除所有Autofac用法修复了该问题。
非常虎头蛇尾的解决方案,但问题已解决......
现在的问题是弄清楚为什么Autofac会以这种方式运行,所有Debugging都显示每个请求都创建了类......但这是另一个问题。