私は .NET 4.5 で EF 5 を使用しています。データベースのモデルを作成し、関数をモデルにインポートしました。TVF と SP を正常にインポートできますが、スカラーの戻り値を持つ関数をインポートできません。デザイナーで可能ですか、それともファイルを手動で編集する必要がありedmx
ますか?
3 に答える
このページのスカラー値関数のセクションまで下にスクロールします。
Entity Framework 5 を使用したデータベース ファースト開発 - スカラー値関数のインポート
この醜い回避策に従うか、この回答の一番下にあるアドバイスに従うことができます。
その記事からの抜粋です(回避策について):
「この方法では、.edmx ファイルの xml を直接少し変更する必要があります。これを行うには、.edmx ファイルを右クリックし、[開く]、[XML (テキスト) エディター] の順に選択します。これが関数の外観です。変更前の .edmx ファイル:
<Function Name="CountActivities" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountHydrations" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountMeals" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="personId" Type="int" Mode="In" />
</Function>
「要素から 'ReturnType' 属性を削除します。次に、各要素に要素を追加します。要素の内容については、以下の変更された .edmx ファイルを参照してください。
<Function Name="CountActivities" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<CommandText>
SELECT [dbo].[CountActivities] (@personId)
</CommandText>
<Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountHydrations" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<CommandText>
SELECT [dbo].[CountHydrations] (@personId)
</CommandText>
<Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountMeals" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<CommandText>
SELECT [dbo].[CountMeals] (@personId)
</CommandText>
<Parameter Name="personId" Type="int" Mode="In" />
</Function>
次に、モデル ブラウザーで、[関数のインポート] フォルダーを右クリックし、[関数のインポートの追加] を選択します。これにより、[関数のインポートの追加] ダイアログ ウィンドウが表示されます。このメソッドを表示します。ダイアログ ウィンドウに次の情報を入力し、[保存] を選択します。」
私のアドバイス:必要な労力を考慮すると、1 行だけを返すテーブル値関数を作成して、同じ効果と目的を達成する 方がはるかに簡単です。
SQL Server でのユーザー定義のテーブル値関数の例を次に示します。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[udfGetTotalMinutesInvoiced] ( @billingType INT )
RETURNS TABLE
AS
RETURN
(
SELECT
SUM([ProgressNote].[TotalMinutes]) AS 'TotalMinutesInvoiced'
FROM
[dbo].[InvoiceEntry]
JOIN [dbo].[ProgressNote]
ON [ProgressNote].[ProgressNoteID] = [InvoiceEntry].[ProgressNoteID]
WHERE
[InvoiceEntry].[BillingTypeID] = @billingType
AND progressNote.[IsRecordedInInvoiceEntry] = 1
)
GO
テーブル値関数内からスカラー値のユーザー定義関数を実際に呼び出すこともできます。
テーブル値関数を呼び出すには、次のように FirstOrDefault メソッドを使用することをお勧めします。
private void UpdateStatisticsPanel()
{
var billingTypeId = int.Parse(txtBillingTypeId.Text);
var totalMinutesInvoiced = context.udfGetTotalMinutesInvoiced(billingType: billingTypeId);
var minutesInvoiced = totalMinutesInvoiced.FirstOrDefault();
var invoiced = new Tuple<string, int?>("totalMinutesInvoiced:", minutesInvoiced);
lstFinancialSummary.Items.Add(invoiced);
var totalMinutesNotInvoiced = context.udfGetTotalMinutesNotInvoiced(billingType: billingTypeId);
var minutesNotInvoiced = totalMinutesNotInvoiced.FirstOrDefault();
var notInvoiced = new Tuple<string, int?>("totalMinutesNotInvoiced:", minutesNotInvoiced);
lstFinancialSummary.Items.Add(notInvoiced);
// remember to push the values up to the ListView.
}