【发布时间】:2016-08-19 18:13:00
【问题描述】:
我有一个服务对象Update
public bool Update(object original, object modified)
{
var originalClient = (Client)original;
var modifiedClient = (Client)modified;
_context.Clients.Update(originalClient); //<-- throws the error
_context.SaveChanges();
//Variance checking and logging of changes between the modified and original
}
这是我调用这个方法的地方:
public IActionResult Update(DetailViewModel vm)
{
var originalClient = (Client)_service.GetAsNoTracking(vm.ClientId);
var modifiedClient = (Client)_service.Fetch(vm.ClientId.ToString());
// Changing the modifiedClient here
_service.Update(originalClient, modifiedClient);
}
这里是GetAsNotTracking 方法:
public Client GetAsNoTracking(long id)
{
return GetClientQueryableObject(id).AsNoTracking().FirstOrDefault();
}
Fetch方法:
public object Fetch(string id)
{
long fetchId;
long.TryParse(id, out fetchId);
return GetClientQueryableObject(fetchId).FirstOrDefault();
}
GetClientQueryableObject:
private Microsoft.Data.Entity.Query.IIncludableQueryable<Client, ActivityType> GetClientQueryableObject(long searchId)
{
return _context.Clients
.Where(x => x.Id == searchId)
.Include(x => x.Opportunities)
.ThenInclude(x => x.BusinessUnit)
.Include(x => x.Opportunities)
.ThenInclude(x => x.Probability)
.Include(x => x.Industry)
.Include(x => x.Activities)
.ThenInclude(x => x.User)
.Include(x => x.Activities)
.ThenInclude(x => x.ActivityType);
}
有什么想法吗?
我查看了以下文章/讨论。无济于事:ASP.NET GitHub Issue 3839
更新:
以下是对GetAsNoTracking 的更改:
public Client GetAsNoTracking(long id)
{
return GetClientQueryableObjectAsNoTracking(id).FirstOrDefault();
}
GetClientQueryableObjectAsNoTracking:
private IQueryable<Client> GetClientQueryableObjectAsNoTracking(long searchId)
{
return _context.Clients
.Where(x => x.Id == searchId)
.Include(x => x.Opportunities)
.ThenInclude(x => x.BusinessUnit)
.AsNoTracking()
.Include(x => x.Opportunities)
.ThenInclude(x => x.Probability)
.AsNoTracking()
.Include(x => x.Industry)
.AsNoTracking()
.Include(x => x.Activities)
.ThenInclude(x => x.User)
.AsNoTracking()
.Include(x => x.Activities)
.ThenInclude(x => x.ActivityType)
.AsNoTracking();
}
【问题讨论】:
-
我认为您将
AsNoTracking()放在哪里可能有点晚了,因为_context.Clients已经被跟踪了。尝试将您的AsNoTracking()直接放在_context.Clients电话上。你所有的lncludes 也应该是AsNoTracking(),除非你打算跟踪它们。 -
@RobertHarvey 正在尝试。会让你知道的。
-
我能问一下你为什么要得到一个原始的和修改过的吗?为什么不能直接获取原件,进行修改,然后调用更新?我看不出修改的意义?
-
@garethb 我必须做一个审计日志。所以我有一个方差检查器来检查两个对象的变化并将其记录到数据库中。
-
如果您对修改后的和原始的都调用 GetAsNoTracking 会发生什么?
标签: c# asp.net entity-framework