相同的DbContext,使用EF Core的几个数据库

时间:2018-04-12 08:54:42

标签: c# entity-framework-core dbcontext

在我的应用程序中,我有一些存储在不同数据库中的数据(例如,由于历史原因,身份和用户信息分别存储在与内容相关的内容中)。

但是我希望能够利用这个'。包括' EF Core的方法,但由于数据存储在不同的DB中,有没有办法在同一个DbContext中查询两个数据库?

2 个答案:

答案 0 :(得分:2)

我看到的一个选项是使用视图将第二个数据库中的所有信息返回到本地数据库。

如果将SQL Server用作本地数据库:

<强> 1。创建数据库链接 Create linked serverssp_addlinkedserver

(如果数据库位于同一个实例上,则可以跳过此步骤)

SQL Server语法:

    sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
       [ , [ @provider= ] 'provider_name' ] [ , [ @datasrc= ] 'data_source' ]   
       [ , [ @location= ] 'location' ] [ , [ @provstr= ] 'provider_string' ]   
       [ , [ @catalog= ] 'catalog' ]   

示例:

EXEC sp_addlinkedserver     
   @server=N'RemoteServer',   
   @srvproduct=N'',  
   @provider=N'SQLNCLI',   -- SQL Server Native Client
   @datasrc=N'RemoteIp\instance1';  

Azure示例:

------ Configure the linked server
-- Add one Windows Azure SQL DB as Linked Server
EXEC sp_addlinkedserver
  @server='RemoteServer', -- here you can specify the name of the linked server
  @srvproduct='',       
  @provider='sqlncli', -- using SQL Server Native Client
  @datasrc = 'myServer.database.windows.net',   -- add here your server name
  @location = '',
  @provstr = '',
  @catalog = 'myDatabase'-- add here your database name as initial catalog(you cannot connect to the master database)

-- Add credentials and options to this linked server
EXEC sp_addlinkedsrvlogin
    @rmtsrvname = 'RemoteServer',
    @useself = 'false',
    @rmtuser = 'myLogin',             -- add here your login on Azure DB
    @rmtpassword = 'myPassword'-- add here your password on Azure DB
EXEC sp_serveroption 'RemoteServer', 'rpc out', true;  

您甚至可以链接到Excel文件中的数据

<强> 2。在本地数据库中创建一个视图

CREATE VIEW UserObjects AS SELECT Id, UserId, Name, Description FROM RemoteServer.myDatabase.dbo.UserObjects

第3。引用UserObjects作为DbContext中的普通表(视图支持INSERT / UPDATE / DELETE,只要它是从单个源表See MS Doc构建的)

public DbSet<User> Users {get;set;}
public DbSet<UserObject> UserObjects {get;set;}

然后将远程表用作本地远程表:

var user  = await _DbContext.Users.Where(u => u.FirstName = "bob").Include(u => u.Objects);

[警告说明] 无法在视图上拥有主键,因此将其作为外键约束进行链接。 add an index to a view似乎也不可能,它可能具有或多或少相同的性能增益,但不是约束部分...原因:

  

视图必须仅引用与视图位于同一数据库中的基表

:(因此,即使您使用所需的WITH SCHEMABINDING创建视图,也会有效:

CREATE UNIQUE INDEX IDX_UserObjects_PK
    ON UserObjects (Id);  
CREATE INDEX IDX_UserObjects_UserId  
    ON UserObjects (UserId);  

答案 1 :(得分:0)

如果最终目标是从多个DB获取记录,另一种方法是调用存储过程并在SP中使用DB。

调用SP的示例:

_databaseContext.Database.ExecuteSqlCommandAsync($"EXEC {storedProcedureName} @param1, @param2", new SqlParameter("param1", param1), new SqlParameter("param2", param2));