重构IUnitOfWork

时间:2018-01-31 19:49:16

标签: asp.net-mvc entity-framework

Premisse:

我正在使用IUnitOfWork Patterns我使用我的方法创建了一个Base类来保存数据。

我的问题:

我发现编写一个方法的问题来自SQLServer的Ne​​xt Number of table,因此,我在每个类中重复这个方法。

类:

BaseContext类:

public class BaseContext<T> : DbContext where T : class
{

    public DbSet<T> DbSet
    {
        get;
        set;
    }



    public BaseContext() : base("DefaultConnection")
    {

        Database.SetInitializer<BaseContext<T>>(null);

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {



        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        // Class Mapping from IMapping

        var typesToMapping = (from x in Assembly.GetExecutingAssembly().GetTypes()
                              where x.IsClass && typeof(IMapping).IsAssignableFrom(x)
                              select x).ToList();

        foreach (var mapping in typesToMapping)
        {
            dynamic mappingClass = Activator.CreateInstance(mapping);
            modelBuilder.Configurations.Add(mappingClass);
        }


    }

    public virtual void ChangeObjectState(object model, EntityState state)
    {
        ((IObjectContextAdapter)this)
                      .ObjectContext
                      .ObjectStateManager
                      .ChangeObjectState(model, state);
    }


    // Implement IUnitOfWork




    public virtual int Save(T model)
    {
        this.DbSet.Add(model);
        this.ChangeObjectState(model, EntityState.Added);
        return this.SaveChanges();
    }

    public virtual int Update(T model, int id)
    {
        var entity = DbSet.Find(id);
        this.Entry(entity).CurrentValues.SetValues(model);
        return this.SaveChanges();

    }

    public virtual void Delete(T model)
    {
        var entry = this.Entry(model);
        if (entry.State == EntityState.Detached)
            this.DbSet.Attach(model);

        this.ChangeObjectState(model, EntityState.Deleted);
        this.SaveChanges();
    }

    public virtual IEnumerable<T> GetAll()
    {
        return this.DbSet.ToList();
    }

    public virtual T GetById(object id)
    {
        return this.DbSet.Find(id);
    }

    public virtual IEnumerable<T> Where(Expression<Func<T, bool>> expression)
    {
        return this.DbSet.Where(expression);
    }

    public IEnumerable<T> OrderBy(Expression<Func<T, bool>> expression)
    {
        return this.DbSet.OrderBy(expression);
    }


}

我的方法NextNumber在每个类中:

public class VersionDao : BaseContext<Version>, IUnitOfWork<Version>
{
    public int Next() => DbSet.Max(x => x.VersionId) + 1;
}

public class TicketDao : BaseContext<ViewModelTicket> , IUnitOfWork<ViewModelTicket>
{
    public int Next() => DbSet.Max(x => x.TicketId) + 1;
}

public class CompanyDao : BaseContext<Company>, IUnitOfWork<Company>
{
    public int Next() => DbSet.Max(x => x.CompanyId) + 1;
}

征集:

我需要一个建议来停止每个班级对Next方法的重复。

谢谢

1 个答案:

答案 0 :(得分:0)

如果您使用的是Entity Framework,则无需实现工作单元模式。如果您点击 DbContext 上的 F12 /转到定义,您会看到以下摘要

  

DbContext实例表示工作单元和   存储库模式,以便它可用于从数据库进行查询   并将更改组合在一起,然后将其写回商店   作为一个单位。 DbContext在概念上类似于ObjectContext。