【发布时间】:2019-09-14 02:21:32
【问题描述】:
我正在尝试通过实体框架从数据库中获取最后插入的 ID,但是我的问题在某种程度上是独一无二的,我无法找到任何解决方案,但要重写我的整个基础架构和业务层,所以我所有的 ID 都是 Guid ,我可以手动创建,或者在提交后通过另一个数据库调用获取最后一条记录。
这就是问题所在。我有一个三层架构,我在其中使用 UoW、存储库、服务和门面。我会从上到下展示我的代码,以便大家理解。
这是我的门面,uow.Commit 正在调用SaveChanges()
public async Task<int> RegisterUserAsync(UserCreateDto user)
{
using (var uow = UnitOfWorkProvider.Create())
{
var id = _userService.Create(user);
await uow.Commit();
return id;
}
}
如您所见,我只将我的 DTO 发送到服务中,我的处理方式是这样的,我也在服务内部进行映射
public virtual int Create(TCreateDto entityDto)
{
var entity = Mapper.Map<TEntity>(entityDto);
Repository.Create(entity);
return entity.Id;
}
最后我的存储库看起来像这样
public TKey Create(TEntity entity)
{
Context.Set<TEntity>().Add(entity);
return entity.Id;
}
有什么优雅的解决方案吗?就像我说的,我唯一的想法是在提交后将所有 Id 切换为 Guid 或第二次调用 Id,我认为这不是很好的解决方案,因为当我想在一个事务中连接两个或多个表时,这是不可能的。
【问题讨论】:
-
我认为应该有一种方法可以让您的数据库处理 GUID 创建。
-
Guid 创建不是问题,您可以让 Db 自动创建它,但在这种情况下,手动创建它会更有效,这样您就可以知道您要插入的 Id 而无需提交.但这是我的后备解决方案,我只想知道是否有办法使用 Integer Id 来做到这一点。
-
如果你对存储过程没问题,那么你可以编写一些原始 sql 来使用输出子句返回插入的 id
标签: c# entity-framework asp.net-core .net-core ef-core-2.2