C#和EntityFramework:在多个项目中使用DBContext

时间:2017-08-07 08:17:01

标签: c# entity-framework

我正在开发一个大型项目,其中IIS-Application,WCF-Service和普通应用程序可以访问具有相同模型类的同一数据库。 现在我想询问是否以及如何将DBContext放在类库中,以便其他每个Project都可以使用该上下文。

以下是类库中DB_Entities的一小部分:

using ManagementLibrary.Model;
using System.Data.Entity;

namespace ManagementLibrary.EntityFramework
{
    public class DB_Entities : DbContext
    {
        public DB_Entities() : base(nameOrConnectionString: "DatabaseConnection") { }

        public DbSet<User> Users{ get; set; }
        // more sets here
    }
}

我尝试在Client-Application的App.config中插入Connection-string和配置:

注册提供者:

<system.data>
    <DbProviderFactories>
      <remove invariant="Npgsql" />
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
</system.data>

添加连接字符串:

<connectionStrings>
    <add name="DatabaseConnection" connectionString="server=192.168.0.2;Port=5432;user id=postgres;password=postgres;database=ManagementDatabase" providerName="Npgsql" />
</connectionStrings>

EF-Config的其余部分:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v13.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
    </providers>
</entityFramework>

现在,当我想添加迁移时,它不起作用。

PM> Enable-Migrations
No context type was found in the assembly 'ConsoleTestClient'.

甚至还有一些更复杂的东西:在我的类库中有一个控制器类,它将DB_Entities作为属性。我想在每个Project中使用该控制器类,因此我必须只编写一次数据库操作的规则。控制器类很大,包含很多方法,这里只是一小部分,你可以看到我想做的事情:

public class UserController: Controller
{
    public User insertUser(User newUser)
    {
        entities.Users.Add(newUser);
    }

    //a lot of more methods here
}

Controller是一个Abstract类,它包含一个私有属性实体(Type:DB_Entities)。

所以,这个小问题的很多文本:我如何配置我的项目以便能够使用类库中的所有控制器和DB_Entity?

2 个答案:

答案 0 :(得分:1)

您可以将实体代码放在rest api调用之后。您也可以将wcf服务与webhttp绑定端点一起使用。是的。在你的情况下,这样的东西将直接工作,否则,你将需要创建一个包含所有内容的共享dll,并在每个项目中复制和引用它。 对于共享dll,您需要为dll创建单独的c#项目。在该解决方案中,添加控制台应用程序以测试您的呼叫。在构建项目时,将在debug或release文件夹中生成dll。将EF置于WCF调用之后,请将延迟加载和代理创建设置为false。

答案 1 :(得分:0)

我不确定你是否可以用EF创建共享类库并使用针对它的迁移功能,因为DLL已经编译它无法编辑到目前为止我知道每次添加 - 迁移它创建新的类迁移文件夹。
但你可以尝试一些场景。

  1. 正如Amit所写,您可以尝试使用API​​构建另一个解决方案。然后,您可以从所有项目中调用该API:WEB,WCF或Mobile。
    1. 您可以为您创建一个项目数据库,该数据库将具有公开存储库的公共存储库。然后,您需要构建它并获取构建DLL并在需要连接到DB的所有项目中引用它。
    2. 或者如果您需要多余的实体,那么您可以为DBContext创建接口并将所有实体的所有DbSet添加到它。