【问题标题】:How can I detach an entity from data graph using Entity Framework Core?如何使用 Entity Framework Core 从数据图中分离实体?
【发布时间】:2019-09-19 17:02:24
【问题描述】:

假设我有一个实体Vehicle,它通过TypeId 引用另一个实体Type。我想使用实体框架更新Vehicle,但我不想更新TypeId(或Type)。

问题是实体框架想要更新整个图,结果是Type 实体的属性在更新Vehicle 时被空值覆盖。

我想我可以在更新之前从数据源中获取Type 实体,但似乎没有必要对数据库进行两次额外调用(读取和保存)来更新不需要更新的实体。

我宁愿从图中分离Vehicle 实体,只更新这个实体。我怎样才能做到这一点?

编辑:

这里有一些代码可以让问题更清楚:

public async Task Update(Vehicle entity)
{
    var dataEntity = mapper.Map<VehicleDataEntity>(entity);
    await repository.Update(entity.Id, dataEntity);
}

如您所见,数据实体在映射期间被实例化(使用 Automappar)。

更新在一个简单的通用存储库中完成:

public async Task Update(Guid id, TEntity entity)
{
    dbContext.Set<TEntity>().Update(entity);
    await dbContext.SaveChangesAsync();
}

这是数据模型:

public class VihecleDataEntity : IEntity
{
    [Key]
    public Guid Id { get; set; }
    public string Description { get; set; }
    public VihecleTypeEntity Type { get; set; }
}

public class VihecleTypeEntity: IEntity
{
    [Key]
    public Guid Id { get; set; }
    public string Description { get; set; }
}

【问题讨论】:

  • 你能粘贴一些代码吗?听起来您有一个与错误更新值有关的错误。分离实体是您几乎从不需要做的事情。
  • @BradM 感谢您的回复。按要求添加代码。
  • 代码仍然没有意义。请发布完整的回购,包括您的自动映射器地图。例如,id 是未使用的参数。我最初的猜测是你的自动映射器代码有一个错误。更好的是,只需创建一个没有自动映射器的 repo。您也不应该将任何模型映射到数据实体。

标签: c# .net-core entity-framework-core


【解决方案1】:

如果您只想更新VehicleDataEntity 属性,可以将VehicleDataEntity.Type 属性设置为null。这不会删除关系,但会阻止 EF 更新相关实体的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2017-06-13
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多