我最近将.NET Core Web应用程序从使用EF Core 2.2升级到了使用EF Core 3.0。升级后,我遇到了一个奇怪的问题。我想将用户插入数据库中,为此,我必须插入几个不同的表中-
我首先要插入User表,这样我可以在“ UserEmail”和“ UserRole”表中使用“ UserId”。我为每个表/实体都有一个存储库类-“ UserRepository”,“ UserRoleRepository”和“ UserEmailRepository”。这些存储库类中的每一个都继承自“ BaseRepository”。
public RepositoryBase(DbContext context)
{
_context = context;
_dbSet = context.Set<TEntity>();
}
public virtual void Add(TEntity entity)
{
_dbSet.Add(entity);
}
* TEntity是“用户”,“ UserRole”或“ UserEmail”
插入操作是在“ UserService”中完成的,该操作将注入包含上述3个存储库的“ UnitOfWork”类。 insert方法还会传递一个“ UserDTO”对象,该对象需要插入所有必需的用户信息。
user = new User
{
FirstName = userDTO.FirstName,
LastName = userDTO.LastName
};
_unitOfWork.UserRepository.Add(user);
_unitOfWork.UserRoleRepository.Add(new UserRole
{
UserId = user.UserId,
RoleId = role.RoleId
});
_unitOfWork.UserEmailRepository.Add(new UserEmail
{
UserId = user.UserId,
EmailAddress = userDTO.EmailAddress,
});
_unitOfWork.Save();
要插入“ UserRole”表中,我已经在前几行中获得了roleId
_unitOfWork.Save()
在实现“ UnitOfWork”类时执行了_context.SaveChanges()
。
我希望所有这些都在同一事务中,并且我想为“ UserRole”和“ UserEmail”表使用“ UserId”。
所以问题是,当代码调用_unitOfWork.Save()
时,它将引发与“ UserId”有关的FK异常。我查看了正在生成的查询,并且SQL Insert语句的顺序与我在代码中的调用顺序相反,它看起来像这样-
应该是
由于某种原因,Entity Framework生成SQL语句的顺序与实际情况相反,因此“ User.Roles”表和“ User.Emails”表没有有效的“ UserId”插入。
现在,这只是在我从EF 2.2升级到EF 3.0之后才开始发生,并且以前都可以使用。我想看看这是否与任何重大更改有关,但没有发现有任何帮助。
也许我错过了一些我需要的小配置,但我不确定。我是否需要添加任何内容到Startup.cs文件中以使其像以前一样工作?