ASP.NET Core上具有身份的工作单元

问题描述

我正在为移动应用程序创建Web api,我需要在用户注册时将数据添加数据库中,我想将数据添加到多个表中

我的用户表设计:

  • AspnetUsers:认身份表
  • StudentUsers:用户详细信息的第二张表
  • TeacherUsers:用户的第三张表

注册时,用户选择他们是学生还是老师。 这里的问题是,注册时有两个表,我想针对这种情况使用工作单元,以防止数据保存失败。如果数据失败,则不要将数据添加到其他表中。

但是我该如何实现身份识别呢?

解决方法

您不需要考虑/过度使用Entity Framework Core的工作单元。

请参阅:

https://gunnarpeipman.com/ef-core-repository-unit-of-work/

因此,为了获得“交易”,您将致电

myInjectedContext.BeginTransaction().
/* alter any/all of the 3 DbSets */
    myInjectedContext.Commit();

其中myInjectedContext是IDataContext。

public class MyTransactionallyFriendlyDbContext : DbContext /*(,IDataContext) */
{
    public LasteDbContext(DbContextOptions<LasteDbContext> options)
        : base(options)
    {
    }
 
    public DbSet<AspnetUser> AspnetUsers { get; set; }
    public DbSet<StudentUser> StudentUsers { get; set; }
    public DbSet<TeacherUser> TeacherUsers { get; set; }
    
    private IDbContextTransaction _transaction;
 
    public void BeginTransaction()
    { 
        _transaction = Database.BeginTransaction();
    }
 
    public void Commit()
    {
        try
        {
            SaveChanges();
            _transaction.Commit();
        }
        finally
        {
            _transaction.Dispose();
        }        
    }
 
    public void Rollback()
    { 
        _transaction.Rollback();
        _transaction.Dispose();
    }
}

这里是满足Ioc /单元测试需求的界面。

public interface IDataContext
{
    DbSet<AspnetUser> AspnetUsers { get; set; }
    DbSet<StudentUser> StudentUsers { get; set; }
    DbSet<TeacherUser> TeacherUsers { get; set; }
 
    void BeginTransaction();
    void Commit();
    void Rollback();
}