2015-07-13 33 views
1

我使用SQL Server 2012和EF 6.1.3EF 6.1.3与“链接服务器”

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

在数据库BI有一些看法是完全按照中央数据库A.一些表

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

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

你能有一个解决方案帮助吗?

+0

你能否更清楚地陈述问题。视图中生成的对象是否没有PK属性?链接的服务器与此有关吗?我相信对于缺少PK问题的观点有一些解决方法。 –

+0

嗨Nick.McDermaid,是的,对象没有PK,没有导航属性。你能带我去一个导游吗? – khoailang

+0

这里是如何欺骗EF以为你的观点PK了一个解释:http://stackoverflow.com/questions/1013333/entity-framework-and-sql-server-view。接受的答案是一个解决方法。再往下看,它解释了如何在不破坏视图的情况下实现它。 –

回答

1

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

+0

hello bubi,我没有在中央数据库A中运行EF Power Tools。我在数据库B中运行该工具。生成的类没有导航属性。你的意思是我会手动添加导航属性? – khoailang

+0

导航属性自动生成。 Wich DBMS是B?你在使用EDMGEN吗? – bubi

+0

不,我正在使用EF Power Tools,不会为视图对象生成导航属性。 SQL Server 2012的所有A和B.谢谢 – khoailang

2

我也有类似的情况曾经,我的问题是与存储过程中的数据库B(我必须通过链接服务器访问该对象在我的中央数据库,姑且称之为数据库答:这是不可能的地图数据库B由于少数公司政策),当使用数据库优先方法时,EF 6不允许您将此存储过程映射到您的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(); 

如果采取这种方法,你可以从你的代名词查看执行原始SQL查询。 For further information, check some the MSDN site,查询将如下所示:

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

我希望我的意见对我有帮助。