Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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
Linq 正在跟踪的实体,尽管存在AsNoTracking_Linq_Entity Framework Core_Ef Core 2.0 - Fatal编程技术网

Linq 正在跟踪的实体,尽管存在AsNoTracking

Linq 正在跟踪的实体,尽管存在AsNoTracking,linq,entity-framework-core,ef-core-2.0,Linq,Entity Framework Core,Ef Core 2.0,我有一个对象Client,它的导航属性是Order对象的列表。每当检索客户机对象时,我都会使用AsNoTracking()包含订单列表 public新IQueryable FindByConditionNoTracking(表达式) { 返回此.ClientContext.Set().Include(s=>s.Orders) .Where(表达式).AsNoTracking(); } 在我的UpdateClient存储库方法中,我接受一个客户机对象。然后,我尝试从数据库检索原始客户机(使用In

我有一个对象Client,它的导航属性是Order对象的列表。每当检索客户机对象时,我都会使用AsNoTracking()包含订单列表

public新IQueryable FindByConditionNoTracking(表达式)
{
返回此.ClientContext.Set().Include(s=>s.Orders)
.Where(表达式).AsNoTracking();
}
在我的UpdateClient存储库方法中,我接受一个客户机对象。然后,我尝试从数据库检索原始客户机(使用Include获取子订单),将客户机参数映射到原始客户机,然后保存到数据库。在这里,我不使用AsNoTracking,因为我特别希望跟踪更改

public new void Update(Client client)
    {

        var id = client.ClientId;
        var original = this.ClientContext.Clients.Include(s => s.Orders).Where(s => s.ClientId == id)
                        .FirstOrDefault<Client>();
        original = _mapper.Map(client, original);
        this.ClientContext.Update(original);
    }
公共新作废更新(客户端)
{
var id=client.ClientId;
var original=this.ClientContext.Clients.Include(s=>s.Orders)。其中(s=>s.ClientId==id)
.FirstOrDefault();
原始=_mapper.Map(客户端,原始);
this.ClientContext.Update(原始);
}
我得到的错误是,已经在跟踪具有相同键值的Order实例。这方面有几个问题:

  • 无论出于显示目的检索到客户机和子订单,我都使用AsNoTracking
  • 我在没有AsNoTracking的情况下检索的唯一地方就是在这个方法中获取原始文件的地方
  • 该错误与父属性无关。如果我在其他地方错误地检索客户机,那么客户机id本身不会有这个错误吗?但是错误似乎只与导航属性有关

  • 感谢所有的洞察力

    如果其他人遇到此问题:Automapper在映射集合时,显然会重新创建整个集合。我通过在映射配置中使用Automapper.Collections解决了上述问题。感谢Mat J的提示

    将客户端参数映射到原始的
    -显示执行此操作的代码。添加到代码中-我正在使用automapper。如果必须映射,为什么首先使用
    AsNoTracking()
    ?这才是真正的问题,你能解释一下吗?实际问题是什么?我使用AsNoTracking是因为FindByCondition并不总是用于编辑;它最常用于显示。
    public new void Update(Client client)
        {
    
            var id = client.ClientId;
            var original = this.ClientContext.Clients.Include(s => s.Orders).Where(s => s.ClientId == id)
                            .FirstOrDefault<Client>();
            original = _mapper.Map(client, original);
            this.ClientContext.Update(original);
        }