C# 在单个webapi控制器中使用多个数据库
我有一个带有EntityFramework(2.1)的DotnetCore(2.1)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(); } 我还在
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
类中,详细说明如何处理此类更改,以及迁移?如何使用此响应获取不同上下文的迁移?