没有外部引用的类库中的实体框架

时间:2016-09-09 05:11:34

标签: c# asp.net-web-api entity-framework-6

我正在试图弄清楚如何将Entity Framework 6添加到一个单独的类库中,而不会让客户端项目中的web.config知道有关其辅助类库的数据库连接的任何信息。原因是单个客户端将能够与不同的组件通信,这些组件将具有完全不同的功能和DB。因此,我希望公开一组基本的公共函数,类库将公开,而客户端应用程序不必关心它们如何获取该信息。

当然这一定是可能的。我错了吗?

这是计划的结构:

  • Web API项目
    • 班级图书馆1(DB1)
    • 类库2(DB2)
    • 类库3(可能包含也可能不包含数据库)

我已经尝试将EF引用移动到一个单独的项目,但似乎无法建立与DB的连接,除非客户端项目具有连接字符串,这是不理想的......

2 个答案:

答案 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; } } 读取的相应连接信息来初始化上下文类文件。