1

Entity Framework 5は初めてで、列挙型のサポートを試していますが、問題が発生しています。以前のバージョンを使用したのと同じようにEF5を使用しています。これは、データベースを作成し、データベースからモデルを生成し、コード生成を使用するためです。そこで、モデルのコード生成プロパティを「デフォルト」に変更し、.ttファイルを削除します。

複数のdllを使用するソリューションがあります。そのうちの1つにはDataModel(edmx)があり、もう1つには男性と女性の2つの値を持つ「EnumGender」という列挙型があります。

データベースには、「Gender」(smallint)というフィールドを持つUsersテーブルがあり、「EnumGender」を使用しようとしています。

EnumGenderは「Sample.Datatypes.Enums」という名前空間にあるため、edmxモデルブラウザで列挙型を追加しようとしています。このために、名前として「EnumGender」を設定し、値を追加せず、「Reference external type」チェックボックスをオンにして、テキストボックスに「Sample.Datatypes.Enums.EnumGender」と入力しました。

問題は、EFがデータモデル名前空間に新しい列挙型を作成しているように見えることです。これは私が望まないので、「Sample.Datatypes.Enums」名前空間でEnumGenderを使用したいと思います。また、EFが作成する新しい列挙型には値がありません...データモデルのcsファイル(生成されたコード)に入力すると、次のように追加されます。

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEnumTypeAttribute(NamespaceName="SampleModel", Name="EnumGender")]
[DataContractAttribute()]
public enum EnumGender : short
{
}

何が起こっているのかわかりません...外部dllのデータ型を使用できない可能性があります...しかし、列挙型のサポートについて読んだことで、これを実行できるはずです...

この問題について私を助けていただければ幸いです。

ありがとう!ファン

4

1 に答える 1

1

明らかではありませんが、これは仕様によるものです。EntityObject テンプレート (モデルのコード生成プロパティを "default" に設定するときに使用されるテンプレート) は、型に特定の属性 (EdmEnumTypeAttribute および列挙型の DataContractAttribute) を持たせる必要があるため、外部型を使用しません。この制約は、型自体もテンプレートによって生成される場合にのみ、確実に満たすことができます。

DbContext テンプレート (デフォルトで追加された .tt ファイル) を使用することを強くお勧めします。これは、POCO 型を使用し、外部型をサポートするためです。

ただし、シナリオで EntityObject テンプレートを使用することが絶対に必要な場合は、外部列挙型を使用するように変更する方法があります。

  1. 列挙型が生成されたものと同じ属性を持っていることを確認してください。(はい、それは EnityObject 生成を使用する別のエンティティ モデルと共有できないことを意味します)
  2. EF 5.x EntityObject T4 テンプレートをダウンロードしてインストールし ます。 /visualstudiogallery.msdn.microsoft.com/94b48556-fcf0-4b9b-8615-20f9066ae9ac
  3. モデルのエンティティ デザイナー ビューの任意の場所を右クリックし、[コード生成項目の追加...] を選択します。
  4. 「EF 5.x EntityObject ジェネレーター」を追加
  5. 追加された .tt ファイルを開きます
  6. 次の行を検索してpublic string SourceCsdlPath{ get; set; }、その前に追加します。

private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName";

7. 以下を検索しGetSourceSchemaTypes<EnumType>().OrderBy(c => c.Name)て置き換えます。

GetSourceSchemaTypes<EnumType>()
    .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName))
    .OrderBy(c => c.Name)

8. 以下を検索しstring typeName = MultiSchemaEscape(usage.EdmType, code); て置き換えます。

string typeName = code.Escape(usage.EdmType.MetadataProperties
                          .Where(p => p.Name == ExternalTypeNameAttributeName)
                          .Select(p => (string)p.Value)
                          .FirstOrDefault())
        ?? MultiSchemaEscape(usage.EdmType, code);
于 2012-09-18T20:01:11.663 に答える