我已经尝试了在堆栈和互联网中找到的多个解决方案,但在此之后我整整一天的工作都已经丢失了
public async Task<ActionResult> Edit(JobeezUserInfoViewModel jobeezUserInfo, HttpPostedFileBase UploadedImage)
{
var user = UserManager.FindById(User.Identity.GetUserId());
//list of languages
var lgs = jobeezUserInfo.Languages.Select(l => l.LanguageId);
//Languages to be deleted
var lngTodel = db.Languages.AsNoTracking()
.Where(ut => ut.JobeezUserInfoId == jobeezUserInfo.ApplicationUserId)
.Where(ut => !lgs.Contains(ut.LanguageId));
//language ids as Ilist for better performace
var ids = lgs as IList<int> ?? lgs.ToList();
//Languages to be added
var lngToAdd = ids
.Where(
lid =>
user.JobeezUserInfo.Languages
.Select(ut => ut.LanguageId) //for each userlanguages create a list if languageids _
.Contains(lid) == false //_check if it does not contain the posted languageids and return the language ids if it is the case(tid is the posted languageid)
)
.Select(tid =>
new Language()
{
JobeezUserInfoId = user.Id,
LanguageId = tid,
Name = Enum.GetName(typeof(Enums.LanguageEnum), tid)
});
//languages to be updated
var lngToUpdate = user.JobeezUserInfo.Languages.Where(l=>ids.Contains(l.LanguageId));
Mapper.CreateMap<JobeezUserInfoViewModel, JobeezUserInfo>(MemberList.Destination);
JobeezUserInfo info = Mapper.Map<JobeezUserInfo>(jobeezUserInfo) as JobeezUserInfo;
user.FirstName = jobeezUserInfo.FirstName;
user.LastName = jobeezUserInfo.LastName;
user.PostCode = jobeezUserInfo.PostCode;
user.PhoneNumber = jobeezUserInfo.Telephone;
if (ModelState.IsValid)
{
//mark modified for the userinfo
db.JobeezUserInfo.Attach(info); // Entity is in Unchanged state
db.Entry(info).State = EntityState.Modified;
而下一行是-我的问题是为什么我不能附加语言对象“ l”
lngToUpdate.ForEach(l =>
{
db.Languages.Attach(l);
db.Entry(l).State = EntityState.Modified;
});
我有错误
“一个实体对象不能被IEntityChangeTracker的多个实例引用。”
我已经打开了快速视图。在下一行之后(图像的一部分还显示了我的控制器动作(viewmodel对象)的输入参数:
//mark modified for the userinfo
db.JobeezUserInfo.Attach(info); // Entity is in Unchanged state
精度:db.changetracket.Entities()中的languageobject是发布到我的服务器(在我的viewModel中)的同一对象,为什么enitity框架无法理解必须跟踪或附加新对象来代替新语言对象(为了清楚起见,我的代码是局部的,如果需要的话,我可以发布完整的代码)我的问题是:我真的不知道正确更新子实体的最佳方法是什么。我在这里做错什么以及如何进行这项工作?提前致谢
我了解到我实际上有两个不同的错误
1。
我遇到此错误是因为lngToUpdate
错误地填充了一个人-谈论以下内容(我的糟糕!;))。
var lngToUpdate = user.JobeezUserInfo.Languages.Where(l=>ids.Contains(l.LanguageId));
它与数据库中已经被跟踪的相同集合。因此,我创建了一个新集合,该集合的属性值已针对每种要更新其语言的语言进行了修改。
2。
现在,对于另外两个列表lngToAdd
和lngToUpdate
,ObjectStateManager
购买后,请购买以下代码
var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager;
我使用管理器objectState
将以前跟踪的语言更改为EntityState.unchanged
,将新语言附加到上下文中并EntityState.Added EntityState.Deleted
分别进行了标记(根据我的列表)。
它奏效了!希望这对某人有帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句