带有“链接服务器”的EF 6.1.3

时间:2015-07-13 04:34:24

标签: entity-framework linked-server

我正在使用SQL Server 2012和EF 6.1.3

我有一个中央数据库A和另一个链接到数据库A的数据库B.这两个数据库用于两个不同的应用程序。

在数据库B中,我有一些视图,与中央数据库A中的某个表完全相同。

我期待的是,当我在数据库B的视图中插入/更新/删除记录时,这些记录将在中央数据库A中插入/更新/删除。

对于使用数据库B的应用程序(这是链接服务器,而不是中央数据库),我使用EF生成视图(使用电动工具)。生成的代码看起来很好,但是,生成的实体当然没有主键属性,也没有导航属性。

你能帮忙解决一下吗?

2 个答案:

答案 0 :(得分:1)

EF(电动工具)使用系统表来检索模式,如果在数据库A上运行电动工具,则无法检索有关链接表的导航信息。可能最好的方法是从数据库B开始生成数据库B的类(删除从数据库A开始生成的相同类)然后混合两个数据库。
最后,您将两个模型混合在一起(将A模型的导航属性添加到B模型,反之亦然)。

答案 1 :(得分:1)

我有过类似的情况,我的问题是数据库B中的存储过程(我可以通过中央数据库中的链接服务器访问此对象,我们称之为数据库A.因此无法映射数据库B到期对于一些公司政策),EF 6不允许您在使用Database First方法时将此存储过程映射到EDMX文件中,因此我想出的是一种欺骗实体框架的方法。

这很简单,我刚在数据库A中添加了SQL同义词,此对象指向数据库B中的查看/存储过程/表(参见附图)SQL Synonym Creation

当然,在我的情况下,我在数据库B中创建了存储过程的同义词,然后在一个方法中我执行了这样的存储过程:

SqlParameter paramNumber1 = new SqlParameter("@firstParameter", someVariable);
//We need to create a class for the Synonym result, which origin is: [Server].[Database].[dbo].[RemoteStoredProcedure]
var result = ctx.Database.SqlQuery<classForTheSPResult>("RemoteStoredProcedure @firstParameter", paramNumber1).ToList();

如果采用此方法,则可以从同义词View执行原始SQL查询。 For further information, check some the MSDN site,查询将如下所示:

using (var context = new BloggingContext()) 
{ 
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList(); 
}

我希望我的评论有所帮助。