C# 在单个webapi控制器中使用多个数据库

C# 在单个webapi控制器中使用多个数据库,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我有一个带有EntityFramework(2.1)的DotnetCore(2.1)webapi项目 我拥有的是一个IProjectRepository界面: public interface IProjectRepository { void GetProject(Guid id); void DeleteProject(Guid id); Project CreateProject(Project prj); int SaveChanges(); } 我还在

我有一个带有EntityFramework(2.1)的DotnetCore(2.1)webapi项目

我拥有的是一个
IProjectRepository
界面:

public interface IProjectRepository
{
    void GetProject(Guid id);
    void DeleteProject(Guid id);
    Project CreateProject(Project prj);
    int SaveChanges();
}
我还在
ProjectRepository
类中实现它:

public class ProjectRepository : IProjectRepository
{
    private readonly ProjectContext context;

    public ProjectRepository(ProjectContext context)
    {
        this.context = context;
    }

    public Project GetProject(Guid id)
    {
        return context.Projects.Find( id );
    }

    public void DeleteProject(Guid id)
    {
        context.Projects.Remove( project );
    }

    public void CreateProject(Project prj)
    {
        context.Projects.Add(project);
    }

    public int SaveChanges()
    {
        return context.SaveChanges();
    }
}
此外,我还有一个
项目控制器

[Route( "api/[controller]" )]
[ApiController]
public class ProjectsController : ControllerBase
{
    private readonly IProjectRepository projectRepository;

    public ProjectsController(IProjectRepository projectRepository)
    {
        this.projectRepository = projectRepository;
    }

    [HttpGet( "{id}", Name = "GetProject" )]
    public ActionResult<Project> GetProjectById( Guid id )
    {
        Project project = projectRepository.GetProject( id );

        if ( project == null )
        {
            return NotFound();
        }
        return project;
    }

    [HttpDelete( "{id}" )]
    public IActionResult DeleteProject( Guid id )
    {
        Project project = projectRepository.GetProject( id );

        if ( project == null )
        {
            return NotFound();
        }

        projectRepository.RemoveProject( project );
        projectRepository.SaveChanges();
        return NoContent();
    }

    /* etc. */
}
[HttpPost("{id}/foo")]
我想要实现的是在一个控制器内使用不同的数据库,同时也使用一个
模型。因此,假设在我的
ProjectController
中有两个不同的
HttpPost
-请求:

[Route( "api/[controller]" )]
[ApiController]
public class ProjectsController : ControllerBase
{
    private readonly IProjectRepository projectRepository;

    public ProjectsController(IProjectRepository projectRepository)
    {
        this.projectRepository = projectRepository;
    }

    [HttpGet( "{id}", Name = "GetProject" )]
    public ActionResult<Project> GetProjectById( Guid id )
    {
        Project project = projectRepository.GetProject( id );

        if ( project == null )
        {
            return NotFound();
        }
        return project;
    }

    [HttpDelete( "{id}" )]
    public IActionResult DeleteProject( Guid id )
    {
        Project project = projectRepository.GetProject( id );

        if ( project == null )
        {
            return NotFound();
        }

        projectRepository.RemoveProject( project );
        projectRepository.SaveChanges();
        return NoContent();
    }

    /* etc. */
}
[HttpPost("{id}/foo")]

如果是
foo
我想写入
foo.db
,如果是
bar
我想写入
bar.db
。简单地向
服务添加多个调用。AddDbContext
显然不起作用。 实现目标的好方法是什么

简单地向services.AddDbContext添加多个调用显然是行不通的

如果使用继承并对子类调用
AddDbContext
,这种方法就可以工作

定义从
ProjectContext
继承的另外两个上下文

public class FooContext : ProjectContext {}

public class BarContext : ProjectContext {}
然后用不同的连接字符串注册它们

services.AddDbContext<FooContext>(opt => opt.UseSqlite("..."))

services.AddDbContext<BarContext>(opt => opt.UseSqlite("..."))
services.AddDbContext(opt=>opt.UseSqlite(“…”))
services.AddDbContext(opt=>opt.UseSqlite(“…”))

好的,这是一个有用的提示,也许您可以在
projectscoontroller
中,尤其是在
ProjectRepository
类中,详细说明如何处理此类更改,以及迁移?如何使用此响应获取不同上下文的迁移?