Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “错误”;一个实体对象不能被多个IEntityChangeTracker实例引用如何正确更新子实体?_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# “错误”;一个实体对象不能被多个IEntityChangeTracker实例引用如何正确更新子实体?

C# “错误”;一个实体对象不能被多个IEntityChangeTracker实例引用如何正确更新子实体?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我已经尝试了在stack和internet中找到的多个解决方案。我为此损失了整整一天的工作。请查看我的代码 public async Task<ActionResult> Edit(JobeezUserInfoViewModel jobeezUserInfo, HttpPostedFileBase UploadedImage) { var user = UserManager.FindById(User.Identity.GetUserId()); //lis

我已经尝试了在stack和internet中找到的多个解决方案。我为此损失了整整一天的工作。请查看我的代码

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;
我有错误

“实体对象不能由多个实例引用 IEntityChangeTracker。“

我已经在下面一行之后打开了快速视图(图像的一部分还显示了我的控制器操作(viewmodel对象)的输入参数):

精度:db.changetracket.Entities()中的languageobject与发布到我的服务器(在我的viewModel中)的对象相同。为什么enitity框架无法理解必须跟踪或附加新对象来代替新语言对象(为了清晰起见,我的代码是部分的,如果需要,我可以发布完整的代码) 我的问题是:我真的不知道正确更新子实体的最佳方法是什么。我在这里做错了什么,以及如何完成这项工作?
提前谢谢

我知道我实际上有两个不同的错误

一,

我之所以出现这个错误,是因为
lngToUpdate
是一个错误填充的数据集-说到下面这行(我的坏!;)

它与数据库中显然已被跟踪的集合相同。 所以我创建了一个新的集合,其中包含要更新属性的每种语言的修改属性值

二,

现在,对于另外两个列表
lngToAdd
lngToUpdate
,使用
ObjectStateManager
购买以下代码

var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager;
我使用管理器将重点跟踪语言的
objectState
更改为
EntityState。未更改
,将新语言添加到上下文中,并分别标记为
EntityState.Added EntityState.Deleted
(根据我的列表)


成功了!希望这对别人有帮助

我使用AsNoTracking()解决了我的亲子问题

这里BOND是我的父表,
GOVBONDINTERESTSCHEDULE
是它的子表。此外,FI是债券的另一个子表。由于EF跟踪,简单更新引发错误。因此,我只是使用
AsNoTracking()
更新了
GOVBONDINTERESTSCHEDULE

下面是我的工作代码。

GOVBONDINTERESTSCHEDULE editmodel = new GOVBONDINTERESTSCHEDULE();
editmodel = new Entities(Session["Connection"] as EntityConnection).
    GOVBONDINTERESTSCHEDULEs.Include("BOND").AsNoTracking().Where(t => t.REFERENCE == Ref).
    SingleOrDefault();
editmodel.STATUS = ConstantVariable.STATUS_APPROVED;
editmodel.LASTUPDATED = DateTime.Now;
editmodel.LASTUPDATEDBY = Session["UserId"].ToString();
using (Entities db = new Entities(Session["Connection"] as EntityConnection)) {
    db.Entry(editmodel).State = EntityState.Modified;
    db.SaveChanges();
}

你可能必须把
lngToUpdate
区分开来。在没有任何解释的情况下进行否决真的很不酷,这就像我们在法国可能被限定为的那样——“这是一只老鼠,这是一种仁慈的力量!”@GertArnold名单是不同的。不管它在第一次迭代时崩溃了什么!问题是语言列表无法附加,因为theEF正在跟踪在我的viewModel中找到的语言列表。无论如何,谢谢!我不知道如何用我的新列表替换此跟踪对象。。?有时候EF在一些细节上真的很难。我想我以前试过这个。但它确实可以帮助某些人,我想澄清的是,adding.AsNoTracking()告诉实体框架停止跟踪实体上的更改。如果您这样做,您的实体应该只在“只读”上下文中使用,比如在WebForm中显示.Name作为标题就可以了。在可以更改和保存实体数据的表单中使用实体是不可取的。
var lngToUpdate = user.JobeezUserInfo.Languages.Where(l=>ids.Contains(l.LanguageId));
var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager;
GOVBONDINTERESTSCHEDULE editmodel = new GOVBONDINTERESTSCHEDULE();
editmodel = new Entities(Session["Connection"] as EntityConnection).
    GOVBONDINTERESTSCHEDULEs.Include("BOND").AsNoTracking().Where(t => t.REFERENCE == Ref).
    SingleOrDefault();
editmodel.STATUS = ConstantVariable.STATUS_APPROVED;
editmodel.LASTUPDATED = DateTime.Now;
editmodel.LASTUPDATEDBY = Session["UserId"].ToString();
using (Entities db = new Entities(Session["Connection"] as EntityConnection)) {
    db.Entry(editmodel).State = EntityState.Modified;
    db.SaveChanges();
}