相关疑难解决方法(0)

有什么不同.AsNoTracking()会做什么?

我有一个关于.AsNoTracking()扩展的问题,因为这一切都很新而且很混乱.

我正在使用网站的每请求上下文.

我的很多实体都没有改变,所以不需要跟踪,但我有以下场景,我不确定数据库会发生什么,甚至在这种情况下它是否有所不同.

这个例子就是我目前正在做的事情:

context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Run Code Online (Sandbox Code Playgroud)

这与上面相同,但从.AsNoTracking()步骤1中删除:

context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Run Code Online (Sandbox Code Playgroud)

步骤1和2使用相同的上下文,但在不同的时间发生.我无法解决的是,是否存在任何差异.由于步骤2是更新,我猜两个都会打两次数据库.

谁能告诉我有什么区别?

.net c# entity-framework entity-framework-4.3

211
推荐指数
6
解决办法
13万
查看次数

ASP.NET MVC - 附加"MODELNAME"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

简而言之,在POSTing包装器模型期间抛出异常并将一个条目的状态更改为"已修改".在更改状态之前,状态设置为'Detached'但调用Attach()会产生相同的错误.我正在使用EF6.

请在下面找到我的代码(模型名称已更改,以便于阅读)

模型

// Wrapper classes
        public class AViewModel
        {
            public A a { get; set; }
            public List<B> b { get; set; }
            public C c { get; set; }
        }   
Run Code Online (Sandbox Code Playgroud)

调节器

        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (!canUserAccessA(id.Value))
                return new HttpStatusCodeResult(HttpStatusCode.Forbidden);

            var aViewModel = new AViewModel();
            aViewModel.A = db.As.Find(id);

            if (aViewModel.Receipt == null)
            {
                return HttpNotFound();
            }

            aViewModel.b = db.Bs.Where(x => x.aID == id.Value).ToList();
            aViewModel.Vendor = db.Cs.Where(x => x.cID …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework

118
推荐指数
7
解决办法
14万
查看次数

找出实体是否附加到dbContext的最合理方法是什么?

当我尝试将实体附加到上下文时,我得到一个例外

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象

这是预期的行为.

但我想知道ObjectStateManager是如何知道的?我之前想自己做这个检查

c# entity-framework-4 ef-code-first

56
推荐指数
3
解决办法
3万
查看次数

附加类型为"X"的实体失败,因为同一类型的另一个实体

我在我的代码中偶然发现了一个奇怪的错误.以前哪个工作,但现在有时工作.

我正在使用EF6来编辑具有某种关系的实体.不编辑我'附加'它们的关系(参见示例代码).

public void EditA(A ThisIsA, B ThisIsB)
    {
        using (var Context = new LDZ_DEVEntities())
        {
            Context.As.Attach(ThisIsA);

            var b = Context.Bs.FirstOrDefault(x => x.BId == ThisIsB.BId);
            //var b = Context.Bs.Find(ThisIsB.BId);

            if (b != null)
                Context.Bs.Attach(b);
            else
                b = ThisIsB;

            if (b.C != null)
                Context.Cs.Attach(b.C);

            ThisIsA.Bs.Add(b);

            Context.SaveChanges();

        }
    }
Run Code Online (Sandbox Code Playgroud)

我编辑了名字以保持简单.

以下行

Context.Cs.Attach(b.C);
Run Code Online (Sandbox Code Playgroud)

抛出此错误:

附加类型为"C"的实体失败,因为相同类型的另一个实体已具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".

引入此行是因为所有C实体都是静态实体.我从不想要创建一个C. 如果我删除此行,每次我将A添加到A; 创建了一个C. 这是不可取的.

额外信息:
A有一个B的
B 列表有一个C.

在我的软件中的多个位置调用此EditA()方法.仅在循环(导入)中调用方法时才会出现此错误.在处理第一条记录时没有问题.但是我在第一个记录之后得到了记录中的错误.

我已经阅读了这些问题和答案,但它们并不适合我:

  1. ASP.NET MVC - 附加"MODELNAME"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

  2. 附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值

c# entity-framework

17
推荐指数
2
解决办法
6万
查看次数

附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值.

让我快速描述我的问题.

我有5个客户的5个数据库,每个数据库都有一个名为SubnetSettings的表.

我已经创建了一个下拉列表来选择一个客户,并将显示属于所选客户的SubnetSetting表,并允许我创建,编辑和删除.

我可以创建,删除没有问题,但当我想编辑数据时,它会带来错误:

'/ TMS'应用程序中的服务器错误.

附加"CFS.Domain.Entities.SubnetSettings"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".

这是我的控制器中的编辑

    // GET: /SubnetSettings/Edit1/5   
    public ActionResult Edit1(short? id)  
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        SubnetSettings subnetsettings = detailView.SubnetSettings.SingleOrDefault(t => t.Id == id); 
        if (subnetsettings == null)
        {
            return HttpNotFound();
        } 
        return View(subnetsettings);
    }


    // POST: /SubnetSettings/Edit1/5   
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit1([Bind(Include = "Id,Name,fDialUp,fPulse,fUseExternalGSMModem,fGsmDialUp,bUploadMethodId")] SubnetSettings subnetsettings)
    {
        if (ModelState.IsValid)
            {
                templateDb2.Save(subnetsettings);   
                return RedirectToAction("Index");
            }
        return View(subnetsettings);
    }
Run Code Online (Sandbox Code Playgroud)

这是EF中的Save方法

     public SubnetSettings Save(SubnetSettings …
Run Code Online (Sandbox Code Playgroud)

c# model-view-controller entity-framework primary-key

6
推荐指数
1
解决办法
2万
查看次数