【问题标题】:Unit of Work with Identity on ASP.NET CoreASP.NET Core 上的身份工作单元
【发布时间】:2020-08-12 19:00:32
【问题描述】:

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

我的用户表设计:

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

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

但是我怎样才能将它实现到身份中呢?

【问题讨论】:

  • 你选择了你的 ORM 了吗? (实体框架核心通常是可疑的)
  • 我正在使用 EF Core

标签: c# sql .net asp.net-core unit-of-work


【解决方案1】:

您不需要过度思考/过度使用 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();
}

【讨论】:

  • 有趣的方法。我是 NHibernate 的人,但我正在努力克服我对 EF 的恐惧 :-) 一个问题:SaveChanges(); 是否有可能?会导致异常而需要回滚?我很高兴看到 MyTransactionallyFriendlyDbContext #Rollback() 的使用示例。
  • NHibernate UoW 正是我所想的......关于(而不是)“过度”。我很少调用或实际编写回滚代码,它就在那里,以防万一。 EFCore(就像大多数 dotnet core 3+ 一样)非常干净。它是重写(C#/Anders/Java)的重写(dotnetFW)。 EFCore 赢得了我的青睐。这篇文章很好地解释了动机。
猜你喜欢
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2018-01-31
相关资源
最近更新 更多