具有多个数据库的实体框架

时间:2014-02-04 19:54:59

标签: c# sql-server entity-framework

无论如何在单个EF上下文中映射多个SQL Server数据库?例如,我正在尝试做这样的事情

select order from context.Orders
where context.Users.Any(user => user.UserID == order.UserID)

我希望按以下方式生成SQL:

select .. from store.dbo.order where userID in 
(select userID from authentication.dbo.user)

并注意数据库名称不同 - 存储在一个地方,身份验证在另一个地方。

我发现了一些处理多个模式的文章(在这种情况下是'dbo'),但没有一个处理多个数据库名称。

3 个答案:

答案 0 :(得分:1)

作为一种潜在的解决方法,您可以从第一个数据库中的第二个数据库创建表的视图,并将映射指向视图。

答案 1 :(得分:0)

我很确定这是不可能的。上下文源自DbContext

  

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

DbContext的配置(连接字符串,模式等)特定于单个数据库。

答案 2 :(得分:0)

这是不可能的。上下文的概念低于数据库的概念,允许这可能是一种不好的做法。允许这样的事情可能会导致开发人员忘记他们正在处理两个数据库,并注意由此产生的所有性能影响。

我想你应该仍然可以使用两个上下文并编写优雅的代码。

var userIds = AuthContext.Users
    .Where(user => user.Name = "Bob")
    .Select(user => user.UserId)
    .ToList();

var orders = StoreContext.Orders
    .Where(order => userIds.Contains(order.UserId))
    .ToList()

首先对身份验证数据库上下文执行查询,以便为第二次查询提供参数。