有没有办法在实体框架中实现跨数据库查询?假设我有两个实体 User 和 Post,User 实体在 database1 中,Post 在 database2 中,这意味着这些实体在不同的数据库中。我应该如何在 Entity Framework 中获取用户的帖子?
问问题
15397 次
4 回答
28
我知道这是一个老问题,但这实际上是可能的。如果数据库在同一台服务器上,那么您需要做的就是使用DbCommandInterceptor
.
例如,如果我附加DbCommandInterceptor
到MyContext
,我可以拦截所有命令执行并将查询中的指定表替换为我的完整数据库路径。
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
// Here, I can just replace the CommandText on the DbCommand - but remember I
// want to only do it on MyContext
var context = contexts.FirstOrDefault() as MyContext;
if (context != null)
{
command.CommandText = command.CommandText
.Replace("[dbo].[ReplaceMe1]", "[Database1].[dbo].[Customers]")
.Replace("[dbo].[ReplaceMe2]", "[Database2].[dbo].[Addresses]")
.Replace("[dbo].[ReplaceMe3]", "[Database3].[dbo].[Sales]");
}
base.ReaderExecuting(command, interceptionContext);
}
这种方法的另一个好处是 EF 模型映射仍然可以正常工作并尊重列属性,不需要视图,也不需要存储过程。
于 2014-11-14T04:29:56.400 回答
25
EF 上下文不支持跨数据库查询。您需要通过 SQL 视图(或同义词)公开 database1 中的帖子,并将其用作该数据库的一部分。
于 2013-01-15T16:09:50.393 回答
11
您可以使用ExecuteStoreQuery
,例如:
var myOb = context.ExecuteStoreQuery<PlainOldClrObject>(
@"select *
from db1.dbo.table1 t1
join db2.dbo.table2 t2
on t2.t1_id = t1.id
where t1.id = {0}",
table1Id).FirstOrDefault();
您必须将PlainOldClrObject
列定义为具有 getter/setter 的属性的类,例如:
class PlainOldClrObject
{
public int Id ( get; set; }
public int Name ( get; set; }
...
}
于 2013-01-15T16:15:21.407 回答
5
不,你不能。您将必须创建上下文并加入自己。见这里。
您可以解决数据库诡计,在一个数据库中创建一个视图,然后在另一个数据库中反映一个表。
于 2013-01-15T16:08:54.403 回答