繁体   English   中英

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

[英]C# and EntityFramework: Using a DBContext in multiple projects

我正在做一个大项目,其中IIS应用程序,WCF服务和普通应用程序可以使用相同的模型类访问相同的数据库。 现在,我想问问是否以及如何将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
    }
}

我试图在客户端应用程序的App.config中插入连接字符串和配置:

注册提供者:

<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作为属性。 我想在每个项目中使用该控制器类,因此我只需要为数据库操作编写一次规则。 控制器类很大并且包含很多方法,这里只是很小的一部分,因此您可以看到我想做的事情:

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

    //a lot of more methods here
}

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

因此,有很多关于这个小问题的文字:如何配置我的项目才能使用类库中的所有Controller和DB_Entities?

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

我不确定您是否可以使用EF创建共享类库并对其使用add-migration函数,因为DLL已被编译,并且据我所知无法进行编辑,每次添加迁移时它都会创建一个新的迁移文件夹中的类。
但是您可以在这里尝试一些方案。

  1. 正如阿米特(Amit)所写,您可以尝试使用API​​构建另一个解决方案。 然后,您可以在所有项目中调用该API:WEB,WCF或Mobile。

要么

  1. 您可以为数据库准备一个项目,该项目将具有公开其接口的公共存储库。 然后,您需要构建它并在需要与DB连接的所有项目中引用DLL。

或者,如果您需要访问实体,则可以为DBContext创建一个接口,并将其所有DbSet放入其中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM