1

次のように、3つのレイヤーで構成されたWinFormsアプリケーションに取り組んでおり、各レイヤーは個別のプロジェクトです。

解決中のプロジェクト

SampleNtierDAL プロジェクト内には、次のように定義された DalServices クラスがあります。

namespace SampleNtierDAL
{
    public class DalServices
    {
        public static List<Employee> GetEmployees()
        {
            List<Employee> employeeList = null;
            using (SampleNtierEntities aSampleNtierEntitiesDbContext = new SampleNtierEntities())
            {
                employeeList = (from emp in aSampleNtierEntitiesDbContext.Employees select emp).ToList();
            }
            return employeeList;
        }
    }
}

SampleNtierBLL プロジェクト内には、次のように定義された BllServices クラスがあります。

namespace SampleNtierBLL
{
    public class BllSerices
    {
        public static List<Employee> GetEmployees()
        {
            return DalServices.GetEmployees();
        }
    }
}

SampleNtierUI プロジェクトには、次のように BllServices に従業員リストを取得するように要求する WinForm ボタン イベントがあります。

namespace SampleNtierUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnGetListOfEmployees_Click(object sender, EventArgs e)
        {
            List<Employee> anEmployeeList = BllSerices.GetEmployees();
        }
    }
}

ここでの問題は、WinForm が Entity Frameworks 6 によって作成された「従業員」と呼ばれるエンティティ モデルを認識できないことです。SampleNtierBLL プロジェクト クラス BllServices は、SampleNtierDAL を参照し、解決するために先頭に use ステートメントがあるため、クラスを認識します。従業員クラス。Employee クラスを解決するために WinForm に同様の参照を追加することを考えましたが、他の記事で、データ アクセス レイヤーへの参照を作成することは想定されていないことを見てきましたが、そのような記事には、この問題に対処する方法が示されていません。
エンティティフレームワークが従業員と呼ばれるエンティティを生成したデータアクセスレイヤーへの参照を作成せずに、UI(WinForm)によって認識されるエンティティモデル(従業員クラス)を取得する方法を教えてください。前もって感謝します。

投稿の更新 2015 年 11 月 5 日 17:13

2015 年 11 月 5 日午後 3 時 14 分に追加した手順でさらにテストを行った結果、.NET 4.5.2 を使用する Visual Studio 2015 でも実際に動作することがわかりました。

私の投稿への更新 2015 年 11 月 5 日午後 3 時 14 分:

応答情報を提供するために費やしたすべての作業について、Reza に感謝します。文書化されているように、ソリューションを Visual Studio 2013 または Visual Studio 2015 で動作させることができませんでした。ただし、解決策を提供する Julie Lerman による Pluralsight.com でインターネット ビデオを見つけました。彼女のソリューションでは、あなたが行った NuGet 管理部分を使用することについて言及していなかったので、それをミックスに追加して、作業プロジェクトになりました。Julie Lerman のビデオのタイトルは次のとおりです。

「生成されたドメイン クラスを EDMX から分離する」および次の場所にあります。

http://www.pluralsight.com/training/player?course=entity-framework5-getting-started&author=julie-lerman&name=ef5-m6-solutions&clip=2&mode=live

手順の一部を彼女の手順と組み合わせることで、Visual Studio 2013 では機能するが Visual Studio 2015 では機能しない次の手順で終了しました。

私のサンプルには、もともと次のプロジェクトがありました。

  • サンプルNtierDAL
  • SampleNtierBLL
  • SampleNtierUI

このプロジェクトのリストに、SampleNtierModels という 4 番目のプロジェクトを追加します。リストは次のようになります。

  • サンプルNtierDAL
  • SampleNtierBLL
  • SampleNtierUI
  • SampleNtierModels

手順: 1) プロジェクト参照を次のように設定します。

  1. SampleNtierBLL は、SampleNtierDAL および SampleNtierModels を参照します。
  2. SampleNtierDAL は SampleNtierModels を参照します
  3. SampleNtierDAL はどのプロジェクトも参照していません
  4. SampleNtierUI は、SampleNtierBLL および SampleNtierModels を参照します。

2) 次に、ファイル エクスプローラー プログラム (ファイル システム ファイルの参照に使用するツール) を起動し、ModelEmployee.tt ファイルを DAL プロジェクト ファイル フォルダーからモデル ファイル フォルダーに移動します。

3) Visual Studio ソリューション エクスプローラーを使用して、SampleNtierModels プロジェクトに移動し、右クリックして [既存のアイテムの追加] を選択します。ダイアログで [すべてのファイル] を選択して ModelEmployee.tt ファイルを表示し、それを選択してプロジェクトに追加します (リンク ファイルは選択しないでください)。

4) 次に、SampleNtierDAL プロジェクトを選択し、ModelEmployee.tt ファイルを右クリックして削除します。これにより、その下にあるすべての .cs ファイルも自動的に削除されます。完了すると、ModelEmployee.tt ノードはなくなります。

5) SampleNtierModels プロジェクトを選択し、エディタで MoadelEmployee.tt ファイルを開く ModelEmployee.tt ノードをクリックします。コンテンツの先頭には、const 文字列 inputFile への代入があります。この文字列を次のように設定して、ModelEmployee.edmx ファイルを見つけます。

const string inputFile = @"..\SampleNiter\SampleNtierDAL\ModelEmployee.edmx

5) 次に、SampleNtierDAL プロジェクトを選択して ModelEmployee.Context.tt ファイルを開き、下にスクロールして using 句を参照し、SampleNtierModels 名前空間を追加します。

if (container.FunctionImports.Any())
{
#>
using System.Data.Entity.Core.Objects;
using System.Linq;
using SampleNtierModels;
<#
}

7) SampleNtierBLL プロジェクトを選択し、BLLServices.cs ファイルを開き、次の using ステートメントを追加します。

using SampleNtierModels;
using SampleNtierDAL;

8) SampleNtierDAL プロジェクトを選択し、DalServices.cs ファイルを開き、次の using ステートメントを追加します。

using SampleNtierModels;

7) SampleNtierUI プロジェクトを選択し、Form1.cs ファイルを開き、次の using ステートメントを追加します。

using SampleNtierModels;
using SampleNtierBLL

8) メニュー バーの [ツール]、[NuGet パッケージ マネージャー] の順にクリックします。

  1. インストール済みパッケージの選択
  2. エンティティ フレームワークの検索
  3. 表示されたEntityFrameworkパッケージを選択し、「管理」ボタンをクリックします
  4. リスト ボックスで、SampleNtierBLL、SampleNtierDAL、SamleNtierUI が選択されていることを確認します。

9) SampleNtierDAL プロジェクトを選択し、ModelEmployee.Context.tt ノードを右クリックして [カスタム ツールの実行] を選択します。

10) SampleNtierModels プロジェクトを選択し、ModelEmployee.tt ノードを右クリックして [カスタム ツールの実行] を選択します。

11) SampleNtierDAL プロジェクトの App.Config ファイルの内容全体を、SampleNtierUI プロジェクトの App.Config ファイルにコピーします。

以下は、プロジェクトが最終的にどのように見えるかを示すサンプル画像と、エンティティ フレームワークから返された 3 行のデータを示すサンプル デバッグ セッションです。このサンプルは、DAL から BLL、そして最後に UI に由来します。Winform UI も、DAL への参照が不要であることを示しています。

この問題は解決されました。もう一度、この問題の解決を手伝ってくれた Reza に感謝します。Visual Studio 2015 を含むこちらのプロセスの更新を求めるメッセージを Juile に残しました。

ここに画像の説明を入力

4

1 に答える 1

3

簡潔な答え

プロジェクトを参照せずにモデルがプロジェクトにDAL表示されるようにするには、モデルを自分のプロジェクトとは別のプロジェクトに配置する必要があります。また、すべてのプロジェクトには、モデル プロジェクトへの参照が必要です。User Interface (UI)Data Access Layer (DAL)

アプローチを使用してこれを行う際の重要なポイントはDatabase/Model First、モデル プロジェクトに「既存の項目を追加」し、モデル.ttのファイルを選択Add as Linkして、ダイアログの [追加] ボタンのドロップダウンから選択することです。

階層化されたソリューションを作成するためのステップ バイ ステップ ガイド

エンティティ フレームワークを使用して別のプロジェクトにモデルを配置するには、次の手順に従います。

プロジェクトを作成する

  1. プロジェクトを作成し、たとえば名前を付けますSample.DAL
  2. 別のプロジェクトを作成して名前を付けるSample.Models
  3. 別のプロジェクトを作成して名前を付けるSample.BLL
  4. 別のプロジェクトを作成して名前を付けるSample.UI

設定参照

次のルールでプロジェクトへの参照を追加します。

  1. Sample.UIに依存してSample.BLLおり、Sample.Models
  2. Sample.BLLに依存してSample.DALおり、Sample.Models
  3. Sample.DAL依存しているSample.Models
  4. Sample.Models他のプロジェクトに依存しない

設定サンプル.DAL

  1. プロジェクトSampleDB.edmxに追加Sample.DAL
  2. Sample.edmxノードを展開してSampleDB.ttノードを展開し、下のすべての .cs ファイルを削除しますSampleDB.tt
  3. SampleDB.ttクリアの性質上CustomTool

Sample.Models の設定

  1. Add Existing ItemSample.Modelsダイアログで、フォルダに移動してコンボボックスから選択しSample.DAL、[追加]ボタンのドロップダウンを選択してクリックし、メニューから選択しますAll filesSampleDB.ttAdd As Link
  2. を選択SampleDB.ttし、プロパティで次のように設定CustomToolNamespaceしますSample.DAL
  3. を右クリックしてSampleDB.ttRun Custom Tool

Nuget パッケージの管理

  1. ソリューションを右クリックし、Manage Nuget Packages for Solutionインストールされているパッケージを選択して選択しEntity Framework、[管理] を選択してクリックします。Sample.DALSample.BLLと を選択Sample.UI

構成 Sample.BusinessLogic

YourEntityBusinessLogic次のコードでクラスを作成します。

public class YourEntityBusinessLogic
{
    public List<YourEntity> GetAll()
    {
        var context = new YourDBContext();
        return context.YourEntities.ToList();
    }
} 

YourDBContext をパブリック プロパティで公開したり、メソッドやコンストラクターの入力パラメーターとして公開したり、戻り値として公開したりしないように注意してください。

設定サンプル.UI

  1. app.configファイルから接続文字列をコピーし、タグの前にSample.DAL貼り付けます。app.configSample.UI<entityframework>

  2. を作成しFormてスタートアップとして設定し、このコードをテストとして、FormLoadまたは必要な場所で実行します。

//Shows count of records in your table
var business = new YourEntityBusinessLogic();
MessageBox.Show(business.GetAll().Count().ToString());

ソリューション構造

これがソリューションの構造です。ご覧のとおり、コンテキストは にSample.DALあり、モデルは にありSample.Modelsます。

DALしたがって、UIプロジェクトに参照を追加する必要はありません。

ここに画像の説明を入力

于 2015-11-04T18:47:07.160 に答える