19

Entity Framework 4を使用しています。データベースファーストモデルを使用しています。つまり、データベースからEDMを生成しました。次に、モデル定義関数をいくつか追加します。私の質問は...どこですか?

それらを.edmxファイルに入れると、次にデータベースを更新して新しいEDMを生成するときに、すべての追加が無効になりませんか?つまり、.Designer.csファイルの上部に、「コードが再生成されると、このファイルへの手動の変更は上書きされます」と書かれています。

それで、どのファイルに追加を入れますか?

4

1 に答える 1

36

モデル定義関数はあまり知られていないので、少し深く取り上げます。

モデル定義関数は、EDMXファイルのCSDL部分に手動で追加する必要があります。ファイルをXMLとして開き、関数を追加する必要があります。たとえば、このモデル定義関数は、従業員のフルネームを生成できます。

<Function Name="FullName" ReturnType="Edm.String">
  <Parameter Name="emp" Type="TestModel.Employee" />
  <DefiningExpression>
    Trim(emp.FirstName) + " " + Trim(emp.LastName)
  </DefiningExpression>
</Function>

これで、EDMXを保存して、デザイナーに戻ることができます。関数は引き続き存在しますが、モデルブラウザには表示されません。データベースからモデルを更新することも、すべてのエンティティを削除することもできますが、関数は引き続き定義されます。EFは、EDMXのCSDL部分のカスタム変更を削除しません。

次に、このモデル定義関数を使用できるように.NET関数を定義する必要があります。あなたはどこでもそれをすることができます。1つの方法は、部分的なクラスをコンテキストに使用することですが、同時に、いくつかのカスタムクラスを使用することもできます。

public static class EdmFunctions
{
    [EdmFunction("TestModel", "FullName")]
    public static string FullName(Employee e)
    {
        throw new NotSupportedException("This function is only for L2E query.");
    }
}

そして、これで完了です。残りのタスクは、Linq-to-Entitiesクエリの関数を使用することだけです。

using (var context = new TestEntities())
{
    var query = from e in context.Employees
                select new
                    {
                        e.Id,
                        FullName = EdmFunctions.FullName(e)
                    };
    var data = query.ToList();
    ...
}

モデル定義関数は、SQLに変換される再利用可能なエンティティSQLであるため、Linq-to-Entitiesクエリでのみ使用できます。モデル定義関数は、はるかに複雑になる可能性があります。

于 2011-04-10T17:56:43.313 に答える