使用DbSet.Add方法时,EF Core 3.0反向SQL插入语句

时间:2019-10-28 16:50:38

标签: asp.net-core .net-core entity-framework-core ef-core-3.0

我最近将.NET Core Web应用程序从使用EF Core 2.2升级到了使用EF Core 3.0。升级后,我遇到了一个奇怪的问题。我想将用户插入数据库中,为此,我必须插入几个不同的表中-

  1. 用户表
  2. 用户电子邮件表
  3. 用户角色表

我首先要插入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语句的顺序与我在代码中的调用顺序相反,它看起来像这样-

  1. “ INSERT INTO User.Emails ...”
  2. “ INSERT INTO User.Roles ...”
  3. “ INSERT INTO User.Users ...”

应该是

  1. “ INSERT INTO User.Users ...”
  2. “ INSERT INTO User.Roles ...”
  3. “ INSERT INTO User.Emails ...”

由于某种原因,Entity Framework生成SQL语句的顺序与实际情况相反,因此“ User.Roles”表和“ User.Emails”表没有有效的“ UserId”插入。

现在,这只是在我从EF 2.2升级到EF 3.0之后才开始发生,并且以前都可以使用。我想看看这是否与任何重大更改有关,但没有发现有任何帮助。

也许我错过了一些我需要的小配置,但我不确定。我是否需要添加任何内容到Startup.cs文件中以使其像以前一样工作?

0 个答案:

没有答案
相关问题