C# 多数据库实体框架
是否在单个EF上下文中映射多个SQL Server数据库?例如,我正试图做这样的事情C# 多数据库实体框架,c#,sql-server,entity-framework,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)
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”),但没有一篇文章涉及多个数据库名称。我很确定这是不可能的。上下文来源于 DbContext实例表示工作单元和存储库模式的组合,这样就可以使用它来查询数据库,并将更改分组,然后将更改作为一个单元写回存储。DbContext在概念上类似于ObjectContext
DbContext的配置(连接字符串、架构等)特定于单个数据库。这是不可能的。上下文的概念低于数据库的概念,允许这样做可能是一种不好的做法。允许这样的事情可能会导致开发人员忘记他们正在处理两个数据库,并考虑由此产生的所有性能影响 我认为您应该仍然能够使用两种上下文并编写优雅的代码
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()
首先对身份验证数据库上下文执行查询,以便为第二次查询提供参数。作为一种可能的解决方法,您可以从第一个数据库中的第二个数据库创建表的视图,并将映射指向该视图。是的,我只想创建一个视图,从另一个数据库中查看表中的链接。仅供参考-我尝试了您的建议,并得到以下错误:“指定的LINQ表达式包含对与不同上下文关联的查询的引用。”该错误有很多stackoverflow项——所有这些都表明不能在单个LINQ中混合上下文,需要分离查询,并将ienumerable从第一个查询结果传递给第二个查询结果。原则保持不变。将此查询分为两部分(首先检索ID,然后通过ID进行查询),但这确实让我怀疑我们使用的数据库分离类型是否是一种不好的做法。我们的数据库由产品思洛存储器隔开,但我们在不同的数据库但相同的数据库实例中也有共同的关注点(如用户和授权),目的是与不同的产品思洛存储器共享这些信息。您可以编写一个跨数据库的SQL查询,因此我希望EF中也有类似的功能,我很惊讶EF不支持它。我不是数据库设计专家,但我认为,对于这样的问题分离,数据库模式是有意的。并不是说分离数据库是一种糟糕的设计,但每种方法都有其不好的一面。我不认为允许一个数据库成为绿地项目的错误,但我可以想象这对你来说是令人沮丧的。仅供参考-我曾试图击败你,但我还没有足够的声誉。