如何在 EF Core 中删除更新关系?
How to delete relations on update in EF Core?
我有以下方法,它接收从 dto 映射的实体。因此它还没有被追踪到。
public async Task UpdateAsync(Entity value, CancellationToken cancellationToken)
{
dbContext.Update(value);
await dbContext.SaveChangesAsync(cancellationToken);
}
public class Entity
{
public Guid Id { get; set; }
public ICollection<Item> Items { get; set; }
}
public class Item
{
public Guid Id { get; set; }
public Guid EntityId { get; set; }
}
实体有一个 属性 个项目,它是一对多的关系。
更新实体和删除现有关系或添加新关系的最佳方法是什么?
目前它不会删除现有的项目,这些项目不再是集合的一部分。我想这是因为,并非所有项目都被跟踪,因为实体是从 dto 创建的。
似乎我必须先从数据库加载现有实体和所有关系,然后手动映射所有属性和关系(添加、删除)。
这意味着很多工作。有没有更好的方法来实现这一目标? EF 能否以某种方式删除未跟踪的关系?
不,实际上你需要分离add/update或删除逻辑。这也是以后维护代码的更好方法。
也许你可以尝试这样的方法(_factory 是 IServiceScopeFactory):
public async Task<TModel> UpdateAsync(TModel model)
{
using var scope = _factory.CreateScope();
await using var context = scope.ServiceProvider.GetRequiredService<ApplicationContext>();
var entry = await context.Set<TModel>().FirstAsync(t => t.Id == model.Id); // try other methods
var entryEntry = context.Entry(entry);
entryEntry.CurrentValues.SetValues(model);
await context.SaveChangesAsync();
return entryEntry.Entity;
}
我有以下方法,它接收从 dto 映射的实体。因此它还没有被追踪到。
public async Task UpdateAsync(Entity value, CancellationToken cancellationToken)
{
dbContext.Update(value);
await dbContext.SaveChangesAsync(cancellationToken);
}
public class Entity
{
public Guid Id { get; set; }
public ICollection<Item> Items { get; set; }
}
public class Item
{
public Guid Id { get; set; }
public Guid EntityId { get; set; }
}
实体有一个 属性 个项目,它是一对多的关系。 更新实体和删除现有关系或添加新关系的最佳方法是什么? 目前它不会删除现有的项目,这些项目不再是集合的一部分。我想这是因为,并非所有项目都被跟踪,因为实体是从 dto 创建的。 似乎我必须先从数据库加载现有实体和所有关系,然后手动映射所有属性和关系(添加、删除)。 这意味着很多工作。有没有更好的方法来实现这一目标? EF 能否以某种方式删除未跟踪的关系?
不,实际上你需要分离add/update或删除逻辑。这也是以后维护代码的更好方法。 也许你可以尝试这样的方法(_factory 是 IServiceScopeFactory):
public async Task<TModel> UpdateAsync(TModel model)
{
using var scope = _factory.CreateScope();
await using var context = scope.ServiceProvider.GetRequiredService<ApplicationContext>();
var entry = await context.Set<TModel>().FirstAsync(t => t.Id == model.Id); // try other methods
var entryEntry = context.Entry(entry);
entryEntry.CurrentValues.SetValues(model);
await context.SaveChangesAsync();
return entryEntry.Entity;
}