gpt4 book ai didi

c# - 检查 EF 实体是否已存在于当前上下文中

转载 作者:行者123 更新时间:2023-12-04 01:47:40 24 4
gpt4 key购买 nike

我知道已经有几个关于这个的问题,但没有一个能真正解决我的问题:

应用背景

我有一个首先使用 Entity Framework 6.1 代码的 Web 应用程序。我在我的 DAL 中使用存储库模式,这意味着,我有 Repo 查询我的上下文并将结果返回给服务,然后服务使用自动映射器将我的实体映射到 View 模型,然后返回一个 VM。服务由 Web API 方法调用。

基于上述架构,很明显我正在使用分离的实体。

我遇到的问题是更新 (PUT) 现有实体。流程如下所示:

将 VM 作为参数传递给 WebAPI 方法的 Angular 问题 HTTP PUT。WebAPI 然后调用服务方法,将 VM 作为参数传递。服务方法使用自动映射器将 VM 转换为 EF 实体服务方法然后调用相应的存储库,将分离的 EF 实体的新实例作为参数传递。

服务方式示例:

    public async Task<List<DependantViewModel>> SaveDependants(int customerId, List<DependantViewModel> dependantViewModels)
{
var dependantEntities = Mapper.Map<List<DependantViewModel>, List<Dependant>>(dependantViewModels);

bool result = false;
foreach (var dependantEntity in dependantEntities)
{
result = await _dependantRepository.InsertOrUpdate(dependantEntity);
if (result != true)
{
// log errror
}
}

return Mapper.Map<List<Dependant>, List<DependantViewModel>>(dependantEntities);
}

基础 repo :

    public virtual async Task<bool> InsertOrUpdate(TE entity)
{
if (entity.Id == 0 || entity.Id == ModelState.New)
{
// insert new item
_context.Entry<TE>(entity).State = EntityState.Added;
}
else
{
// update existing item
_context.Entry<TE>(entity).State = EntityState.Modified;
_context.Entry<TE>(entity).Property(o => o.CreatedUserId).IsModified = false;
_context.Entry<TE>(entity).Property(o => o.CreatedDate).IsModified = false;
}
return await _context.SaveChangesAsync() > 0;
}

尝试设置时出现异常:

_context.Entry(entity).State = EntityState.Modified;

Attaching an entity of type 'Business.Data.Entities.Customer.Dependant' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

据我了解,发生这种情况是因为在设置实体状态之前需要先附加分离的实体。这个问题是,我无法附加实体,因为它已经在 context.Dependant.local 集合中。出于某种原因, Entity Framework 已经在跟踪实体。

有没有办法首先检查上下文中是否存在实体,如果不存在,则附加,否则,检索已经附加的实体,并将修改后的实体的更改应用到附加实体,如果这是有道理的。

感谢任何反馈

最佳答案

这对我有用:

public virtual async Task<bool> InsertOrUpdate(TE entity)
{
if (entity.Id == 0 || entity.Id == ModelState.New)
{
// insert new item
_context.Entry<TE>(entity).State = EntityState.Added;
}
else
{
var attachedEntity = _context.ChangeTracker.Entries<TE>().FirstOrDefault(e => e.Entity.Id == entity.Id);
if (attachedEntity != null)
{
// the entity you want to update is already attached, we need to detach it and attach the updated entity instead
_context.Entry<TE>(attachedEntity.Entity).State = EntityState.Detached;
}

_context.Entry<TE>(entity).State = EntityState.Modified; // Attach entity, and set State to Modified.
_context.Entry<TE>(entity).Property(o => o.CreatedUserId).IsModified = false;
_context.Entry<TE>(entity).Property(o => o.CreatedDate).IsModified = false;
}
return await _context.SaveChangesAsync() > 0;
}

关于c# - 检查 EF 实体是否已存在于当前上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31283546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com