【问题标题】:Entity Framework in Class Library without outside references没有外部引用的类库中的实体框架
【发布时间】:2016-09-09 05:11:34
【问题描述】:

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

这肯定是可能的。我弄错了吗?

这是计划中的结构:

  • Web API 项目
    • 类库 1 (DB1)
    • 类库 2 (DB2)
    • 类库 3(可能包含也可能不包含 DB)

我尝试将 EF 引用移动到单独的项目,但似乎无法连接到数据库,除非客户端项目具有连接字符串,这并不理想...

【问题讨论】:

  • 文本模板生成器 *.Context.tt 有模板,为 DBContext 创建了默认构造函数。找到类似这样的东西 public () : base("name=") 并替换或添加您自己的附加参数化构造函数( base(connstr) 可以使用名称或连接字符串)
  • 我尝试将 EF 移动到一个单独的项目中,但除非客户端在其 web.config 中包含连接字符串,否则它永远无法运行 :( 我不确定 .Context 是否存在。 tt 是否仍然适用于 Code-First 模型?
  • 轻松让Connectionstring存储在类库项目设置中,你为每个需要连接字符串的类库

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


【解决方案1】:

您的 Web API 项目中 DLL 使用的连接必须在 web.config 中定义。 您可以使用多个连接字符串并通过名称来识别它们,如下所示:

<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

【讨论】:

  • 谢谢山姆!我不确定这是否有助于解决手头的问题(除非我弄错了)。我的数据库连接工作正常,但我想弄清楚是否可以从客户端项目中删除对 EF 的任何引用并将其包含在单独的 DAL 项目中......
  • 好吧,当然,按照我的建议去做,将 ClassLibraryOneDbContext 放在 ClassLibraryOne 中,将 ClassLibraryTwoDbContext 放在 ClassLibraryTwo 中。这些项目将引用实体框架,而不是您的 Web API 项目。然后,您的 Web API 项目将引用 ClassLibraryOne 和 ClassLibraryTwo
  • 哦,我明白了,对 - 我已经尝试过但没有成功,但会再次检查并报告。再次感谢!
【解决方案2】:

据我了解,您的类库项目有自己的数据库连接,客户端不会知道。

您希望您的类库某个地方读取这些数据库连接信息,并且某个地方不应该是客户的网络.config 文件。

如果我上面的理解是正确的,那么你可以有一个单独的配置文件,例如class1project.xml,你的库会一直读取这个xml文件来获取连接信息。

您的下一个问题可能是,您的客户将如何从我们的类库中初始化 DBContext 类。由于您的上下文类仍在 web.config 文件中寻找特定的连接字符串。

为此,您可以将上下文类的构造函数设置为internal,这样您的客户端就无法自行调用它。然后可以在您的项目中使用static 方法(如CreateContext)在您的项目中拥有一些其他static 类,并且此方法将通过传递将从class1project.xml 文件中读取的适当连接信息来初始化上下文类。

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多