我正在试图弄清楚如何将Entity Framework 6添加到一个单独的类库中,而不会让客户端项目中的web.config知道有关其辅助类库的数据库连接的任何信息。原因是单个客户端将能够与不同的组件通信,这些组件将具有完全不同的功能和DB。因此,我希望公开一组基本的公共函数,类库将公开,而客户端应用程序不必关心它们如何获取该信息。
当然这一定是可能的。我错了吗?
这是计划的结构:
我已经尝试将EF引用移动到一个单独的项目,但似乎无法建立与DB的连接,除非客户端项目具有连接字符串,这是不理想的......
答案 0 :(得分:1)
必须在web.config中定义Web API项目中DLL使用的连接。 您可以使用多个connectionStrings并按名称识别它们:
<connectionStrings>
<add name="DatabaseOne" connectionString="" />
<add name="DatabaseTwo" connectionString="" />
<connectionStrings>
接下来,您必须配置DataContext以使用正确的:
public class ClassLibraryOneDbContext : DbContext
{
public ClassLibraryOneDbContext()
: base("DatabaseOne")
{
}
}
...
public class ClassLibraryTwoDbContext : DbContext
{
public ClassLibraryTwoDbContext()
: base("DatabaseTwo")
{
}
}
或者您可以通过编程方式设置它,但这不是我的建议,因为这使得它非常不灵活:https://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnectionstringbuilder(v=vs.110).aspx
答案 1 :(得分:1)
从问题我的理解是你的类库项目有自己的数据库连接,客户端不知道。
您希望您的类库从某个地方 一些如何读取这些数据库连接信息,并且某个地方不应该是客户的网站.config文件。
如果我的上述理解是正确的,那么您可以拥有一个单独的配置文件,例如class1project.xml
,并且您的库将始终读取此xml文件以获取连接信息。
您的下一个问题可能是,您的客户将如何从我们的类库中初始化DBContext
类。由于您的上下文类仍在web.config文件中查找特定的连接字符串。
为此,您可以将上下文类的构造函数设置为internal
,以便您的客户端无法单独调用它。然后,您可以在static
方法中使用static
方法在CreateContext
类中添加其他class1project.xml
类,此方法将通过传递将从foreach($inventoryItems->Items as &$item){
$images = Inventory::GetInventoryItemImages($item->Id, $authorization->Token, "https://api.linnworks.net/");
$item->images =[];
foreach($images as $image){
$imageSource = $image->Source;
$item->images[] = $imageSource;
}
}
读取的相应连接信息来初始化上下文类文件。