ASP.NET 核心上具有身份的工作单元
Unit of Work with Identity on ASP.NET Core
我正在为移动应用程序创建网络 api,我需要在用户注册时将数据添加到数据库,我想将数据添加到多个 tables
我的用户table设计:
- AspnetUsers:默认身份 table
- StudentUsers:用户详细信息的第二个table
- TeacherUsers:用户
的第三个 table
在注册时,用户选择他们是学生还是老师。
这里的问题是,注册时有两个table,我想针对这种情况使用Unit of Work,以防止数据保存失败。如果数据失败则不将数据添加到其他table.
但是我怎样才能将其应用到身份中呢?
您不需要 overthink/overdo 工作单元与 Entity Framework 核心。
参见:
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/Unit测试需要的接口。
public interface IDataContext
{
DbSet<AspnetUser> AspnetUsers { get; set; }
DbSet<StudentUser> StudentUsers { get; set; }
DbSet<TeacherUser> TeacherUsers { get; set; }
void BeginTransaction();
void Commit();
void Rollback();
}
我正在为移动应用程序创建网络 api,我需要在用户注册时将数据添加到数据库,我想将数据添加到多个 tables
我的用户table设计:
- AspnetUsers:默认身份 table
- StudentUsers:用户详细信息的第二个table
- TeacherUsers:用户 的第三个 table
在注册时,用户选择他们是学生还是老师。 这里的问题是,注册时有两个table,我想针对这种情况使用Unit of Work,以防止数据保存失败。如果数据失败则不将数据添加到其他table.
但是我怎样才能将其应用到身份中呢?
您不需要 overthink/overdo 工作单元与 Entity Framework 核心。
参见:
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/Unit测试需要的接口。
public interface IDataContext
{
DbSet<AspnetUser> AspnetUsers { get; set; }
DbSet<StudentUser> StudentUsers { get; set; }
DbSet<TeacherUser> TeacherUsers { get; set; }
void BeginTransaction();
void Commit();
void Rollback();
}