在外部ClassLibrary中的控制器中访问EntityFramework数据库

时间:2018-07-03 13:04:04

标签: c# asp.net-mvc entity-framework class-library

我要完成的任务:

我想在主项目之外(在外部类库中)保留一些asp.net mvc控制器。将会有一个名为“ DataSync”的ClassLibrary,将来所有的asp.net mvc项目都将引用它。

工作方式:

在“ DataSync”中,我为数据库数据管理创建了自定义DbContext。

//IN DATASYNC PROJECT
public class TrackedDbContextWithIndentity<TUser>: IdentityDbContext<TUser> where TUser : IdentityUser
{
    public TrackedDbContextWithIndentity(DbContextOptions<TrackedDbContextWithIndentity<TUser>> options) : base(options)
    {
    }

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

    /// <summary>
    /// Modified version of EF SaveChanges method. Runs additional query modifications.
    /// </summary>
    /// <returns></returns>
    public override int SaveChanges()
    {
        // some modifications to SaveChanges
    }
}

想法是,引用“ DataSync” ClassLibrary的项目将具有自己的DbContext类,用于从TrackedDbContextWithIndentity继承的EntityFramework数据管理。为此,我向我所有项目的数据库中注入了DataExchangeInfo DbSet和对SaveChanges方法的修改。

我还在“ DataSync” ClassLibrary中保留了一些控制器。这就是我将那些控制器注入到我的项目中的方式:

        // IN PROJECT REFERENCING DATASYNC
        services.AddMvc(options =>
        {
            //...
        })
        // Added WebAPI Controller from DataSync class library
        .AddApplicationPart(Assembly.Load(new AssemblyName("DataSync")));

现在,当我启动一个项目时,可以访问在“ DataSync”项目中指定的WebAPI方法。

有什么问题:

假设我要从“ DataSync”中的控制器访问数据库。因为我在“ DataSync”中仅有的DbContext是TrackedDbContextWithIdentity,所以我正在与其建立连接(没关系,此特定控制器将仅修改TrackedDbContextWithIdentity中的DbSet)。

//won't compile, TrackedDbContextWithIndentity need to have TUser specified

public class SyncEndpointController : Controller
{
    private readonly TrackedDbContextWithIndentity _context;

    public SyncEndpointController(TrackedDbContextWithIndentity context)
    {
        _context = context;
    }

    //...
}

问题是,TrackedDbContextWithIndentity需要称为TUser的泛型类型(因为EntityFramework的类需要IdentityDbContext)。我无法在SyncEndpointController中提供它,因为“ DataSync”没有它。 TUser是一个类,用于指定数据库中特定用户的某些值,并且其配置不同于所有引用“ DataSync”的项目。 “ DataSync”永远不会拥有适合TUser的类,同时我需要从SyncEndpointController访问数据库。

我是否可以通过某种方式从引用“ DataSync”到“ DataSync”的项目中传递TUser泛型类型?还是有其他更好的方法来解决这个问题?

0 个答案:

没有答案