我試圖在棧和互聯網找到了多個解決方案,我已經失去了這背後的工作一整天,請看看我的代碼錯誤「一個實體對象不能被多個IEntityChangeTracker實例引用」。 :如何正確更新子實體?
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;
});
我有錯誤
「的實體對象不能被 IEntityCha的多個實例引用ngeTracker「。
我已打開的快速查看後,將下面的行(圖像的一部分也示出了我的CONTROLER動作的輸入參數(視圖模型對象):
//mark modified for the userinfo
db.JobeezUserInfo.Attach(info); // Entity is in Unchanged state
精密:db.changetracket.Entities()中的languageobject是發佈到我的服務器(在我的viewModel中)的同一個對象,爲什麼enitity框架無法理解新對象必須被跟蹤或附加以代替新的語言對象(我的代碼是cla部分的rity我可以張貼完整的代碼,如果需要的話) 我的問題是:我真的不知道什麼是正確更新子實體的最佳方法。我在這裏做錯了什麼,以及如何獲得這項工作? 由於事先
您可能必須使'lngToUpdate'不同。 –
如果沒有解釋任何事情,我們可能在法國取得合格的資格就會降級,這真的不是一件好事 - 「c'est rat,mais et merci de votre gentillesse!」 @GertArnold的名單是不同的。無論它在第一次迭代本身崩潰!問題是,不能附加語言列表,因爲EF正在跟蹤我的viewModel中找到的語言列表,謝謝!我不知道我可以用我的新名單替換這個跟蹤的對象..?有時候EF真的很難處理它的一些缺陷。 –