【发布时间】:2017-08-30 10:19:32
【问题描述】:
抱歉标题,我找不到合适的描述。
我有四层:
- 核心层:包含 DTO、服务接口和存储库。
- 业务层:包含处理业务逻辑的“服务”。
- 数据访问层:包含处理数据库访问和实体到 DTO 转换的存储库。
- 表示层:UI 的东西
我遇到了一个我不知道如何最好地解决的问题。我正在向数据库异步添加一个实体,如下所示:
// The AdministrationRate has an ID property, Entity Framework does treat the property as an Identity and does increment it.
var adminRate = new AdministrationRate() {FosterChildID = fosterChild.ID};
await adminRateService.AddAdministrationRate(adminRate);
AdministrationRateService:
public async Task AddAdministrationRate(AdministrationRate administrationRate) => await repo.AddAdministrationRate(administrationRate);
AdministrationRateRepository:
//I use a generic repository to avoid code repition.
//Notice the DTO to entity conversion. ID is not set in the conversion.
public async Task AddAdministrationRate(AdministrationRate administrationRate) => await Add(administrationRate.ToEntity());
存储库:
public async Task Add(TEntity entity)
{
using (var db = new DatabaseContext())
{
db.Entry(entity).State = EntityState.Added;
await db.SaveChangesAsync();
}
}
确实有效,但问题是添加后新生成的实体 id 并未反映在 DTO 中(DTO.ID = 0)。
我不可能返回更新后的实体,因为它需要我将实体转换为我的表示层中的 DTO 以使其始终保持异步。
由于通用存储库,我也不能只返回 ID。
我真的不想摆脱通用存储库,因为它非常有用,但我真的看不到另一种在不更改数据库的情况下安全地执行此操作的方法(我做不到)。
那么,我该怎么办?
【问题讨论】:
标签: c# entity-framework asynchronous n-layer