- ABP Framework version: v4.2.2
- DB provider: EF Core
- Tiered (MVC) or Identity Server Separated (Angular): no
We have an object named 'trading company', this object contains a list of 'trading company dynamic fields'
public class TradingCompany : FullAuditedEntity<Guid>
{
///other props
/// <summary>
/// DynamicFields.
/// </summary>
public IEnumerable<TradingCompanyDynamicField> Dynamicfields { get; set; }
}
public class TradingCompanyDynamicField: Entity<Guid>
{
/// <summary>
/// DynamicField.
/// </summary>
public string DynamicField { get; set; }
}
In the trading company appservice we have to update all the dynamic fields manually
public virtual async Task<TradingCompanyDto> UpdateAsync(Guid id, TradingCompanyUpdateDto input)
{
var tradingCompany = _tradingCompanyRepository.AsQueryable()
.Where(d => d.Id == id)
.Include(d => d.Dynamicfields)
.FirstOrDefault();
var currentList = tradingCompany.Dynamicfields;
ObjectMapper.Map(input, tradingCompany);
tradingCompany = await _tradingCompanyRepository.UpdateAsync(tradingCompany);
// Delete in current not in input.
var toDelete = currentList.Where(c => currentList.Select(d => d.Id).ToList().IndexOf(c.Id) == -1);
await _tradingCompanyDynamicFieldRepository.DeleteManyAsync(toDelete);
// Add in input, not in current.
var toAdd = currentList.Where(c => currentList.Select(d => d.Id).ToList().IndexOf(c.Id) == -1);
await _tradingCompanyDynamicFieldRepository.InsertManyAsync(
toAdd.Select(a => new TradingCompanyDynamicField
{
DynamicField = a.DynamicField,
TradingCompanyId = tradingCompany.Id
}));
// Update others.
var toUpdate = currentList.Where(c => currentList.Select(d => d.Id).ToList().IndexOf(c.Id) > -1);
await _tradingCompanyDynamicFieldRepository.UpdateManyAsync(
toUpdate.Select(u => ObjectMapper.Map(currentList.FirstOrDefault(i => i.Id == u.Id), u))
);
return ObjectMapper.Map<TradingCompany, TradingCompanyDto>(tradingCompany);
}
What we want would be something like this, this would also update all dynamicfields automatically:
public virtual async Task<TradingCompanyDto> UpdateAsync(Guid id, TradingCompanyUpdateDto input)
{
var tradingCompany = _tradingCompanyRepository.AsQueryable()
.Where(d => d.Id == id)
.Include(d => d.Dynamicfields)
.FirstOrDefault();
ObjectMapper.Map(input, tradingCompany);
tradingCompany = await _tradingCompanyRepository.UpdateAsync(tradingCompany);
return ObjectMapper.Map<TradingCompany, TradingCompanyDto>(tradingCompany);
}
Executing the desired code results in swagger to the expected data. For example, update a trading company having 3 dynamic fields to one having only 2, returns an object only containing the 2 dynamic fields. But when we get by id/list or check in the database, we'll see all dynamic fields have the property 'isdeleted' set to true.
How can we achieve this?
Kind regards Lotte
4 Answer(s)
-
0
Hi,
This is not a feature we are planning to add to the ABP Framework in a near time. However, the problem (if we say it is a problem) you have is a very commonly discussed (example) topic by the EF developers. You can google it like "ef core graph update". You will find some good solutions.
Best regards.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
This question has been automatically marked as stale because it has not had recent activity.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)