我一直在寻找不同的主题,但无法找到能给我清晰画面的答案。
以下是该方案:
我正在使用MVC创建一个应用程序&实体框架DB首先。我有两个数据库,DB1是我的应用程序的专用数据库,DB2是许多其他应用程序使用的巨大的通用数据库。我只需要使用DB2中的特定表/视图。
以下是我可以使用的方法:
我不想使用方法#3,因为我提到DB2很庞大,我只需要使用DB2中的几个表。
另外,为了防止我想使用DB1的代码优先方法,在这种情况下最好的解决方案是什么。
答案 0 :(得分:1)
我经常有三个以上模型的项目,因为我们有很多数据库。
我会创建一个具有两个不同上下文的两个EDMX设置。像往常一样创建应用程序DB1 Context然后创建一个额外的上下文,只从DB2中获取您感兴趣的那些表。
为了让您的生活更轻松,更容易维护,通常只需为每个模型创建一个DLL,使其具有自己的命名空间,这样您就可以区分DB1中的用户和DB2中的用户,并添加或从一个实体中移除实体而不影响另一个实体。
每个DLL都有一个app.config连接字符串,可以获取数据,例如
<add name="DB1Entities" connectionString="metadata=res://*/DB1Model.csdl|res://*/DB1Model.ssdl|res://*/DB1Model.msl;provider=System.Data.SqlClient;provider connection string="data source=(local);initial catalog=ClientDb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="DB2Entities" connectionString="metadata=res://*/DB2Model.csdl|res://*/DB2Model.ssdl|res://*/DB2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=(local);initial catalog=ClientMaster;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
<add name="DefaultConnection" connectionString="Data Source=(local);Initial Catalog=Reports;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>
请记住将每个连接字符串从Dll的App.config复制到您的应用程序app.config或您的web.config文件中。
在你的项目中引用DLL,然后加载你的上下文。
DB1Entities DB1Context = new DB1Entities()
DB2Entities DB2Context = new DB2Entities()
您现在可以愉快地区分DB1和DB2实体,并像这样使用其中一个内容。
var address1 = DB1Context.Addresses.Single(a => a.AddressId == 1);
var address2 = DB2Context.Addresses.Single(a => a.Id == address1.GlobalAddressId);