web-dev-qa-db-ja.com

Entity Framework DB Firstで既存の列挙型を使用する方法

Entity Framework 5、DBを最初に使用しています。モデルに列挙型を定義し、フィールドのタイプをその列挙型に設定する方法を知っています。

今、私はフィールドMyFieldを外部で、つまりEFモデルではなく(OtherNamespace.MyEnum)。デザイナーがタイプをモデルの外に設定することを許可していません。 edmxファイルを手動で編集してみましたが、エラーが発生します。

エラー10016:アイテム 'MyField'の解決中にエラーが発生しました。例外メッセージは、「未解決の参照「OtherNamespace.MyEnum」です。」です。

OtherNamespace.MyEnumは私のプロジェクトによって参照されています。

どうやってやるの?

27
Shaul Behr

これは可能ですが、データベース側で少し犠牲を払う必要があります。 Entity Framework(5以降)は、フィールドの列挙へのマッピングをサポートしていますが、bytesbyteshortushortintuintlong、またはulongタイプ。

次のサンプルテーブルがあるとします。

CREATE TABLE [People](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] [varchar](50) NOT NULL,
    [Title] [int] NOT NULL
)

Titleは整数として宣言されています。実際のデータベースでは、これはTitleTypesテーブルへの外部キーである可能性があります。

また、結び付ける外部列挙が次のように定義されているとします。

namespace Enumerations
{
    public enum TitleEnum
    {
        Mr,
        Mrs,
        Dr,
        None
    }
}

PeopleテーブルをEDMXにインポートすると、Title列を右クリックしてConvert to Enum

Convert To Enum

これにより、ダイアログボックスが表示され、EDMX ModelStoreで列挙型の名前を指定し、列挙型の値を定義できます[〜#〜] or [〜#〜]Reference external typeを介した外部列挙へのリンク。

タイプ名にTitleEnumを付け、参照外部タイプを確認し、提供されたフィールドにEnumerations.TitleEnumと入力します。 [OK]をクリックすると、列が外部列挙に関連付けられます。

注:

  • 両方ともTitleEnumと呼ばれますが、これは外部列挙へのパススルーとして機能します
  • 列のタイプと外部列挙が一致する必要があります

Linking the Enumeration

これで、新しい人物を作成するときに、列挙を利用でき、それはそのInt表現に変換されます。

Data.ScratchEntities context = new Data.ScratchEntities();
Data.Person person = new Data.Person();
person.Name = "Jane Smith";
//Note the use of the external enumeration here
person.Title = Enumerations.TitleEnum.Mrs;
context.People.Add(person);
context.SaveChanges();

Intellisense

52
cbeckner