次のように、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 から分離する」および次の場所にあります。
手順の一部を彼女の手順と組み合わせることで、Visual Studio 2013 では機能するが Visual Studio 2015 では機能しない次の手順で終了しました。
私のサンプルには、もともと次のプロジェクトがありました。
- サンプルNtierDAL
- SampleNtierBLL
- SampleNtierUI
このプロジェクトのリストに、SampleNtierModels という 4 番目のプロジェクトを追加します。リストは次のようになります。
- サンプルNtierDAL
- SampleNtierBLL
- SampleNtierUI
- SampleNtierModels
手順: 1) プロジェクト参照を次のように設定します。
- SampleNtierBLL は、SampleNtierDAL および SampleNtierModels を参照します。
- SampleNtierDAL は SampleNtierModels を参照します
- SampleNtierDAL はどのプロジェクトも参照していません
- 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 パッケージ マネージャー] の順にクリックします。
- インストール済みパッケージの選択
- エンティティ フレームワークの検索
- 表示されたEntityFrameworkパッケージを選択し、「管理」ボタンをクリックします
- リスト ボックスで、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 に残しました。