簡體   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