1

私は .NET 4.0 WinForms アプリケーションを使用しており、Model First Approach で Entity Framework 5 を使用しています。VS EF デザイナーで、型のスカラー プロパティを多数持つエンティティを 12 個ほど作成し、Stringプロパティ ツールバーで、DB の要件に合わせてそれらの パラメーター (つまり、一般パラメーター、ファセットパラメーター) を構成しました。

BLレイヤーでは、メソッドを使用するなどして、エンティティオブジェクトに正しい値が含まれているかどうかを確認する目的でエンティティオブジェクトを検証できますDbContext.Entry(Of T)(entity).GetValidationResult()。しかし、WinForms の GUI レイヤー入力フィールド検証も開発する必要があります。エンティティ セット プロパティのメタデータ値に基づいて動的 GUI 検証を実装し、BL 検証を GUI 検証と同期させ、記述されたソース コードの冗長性を回避したいと考えています。

私の質問は、実行時に自動生成されたエンティティのメタデータ値、特にファセット メタデータ値 (つまり、 Fixed LengthMax LengthNullable ) を取得するにはどうすればよいですか?

私が知っているように、手動で作成された部分クラスのプロパティ属性に基づくデータ注釈を利用する可能性があります。ただし、モデル ファーストのアプローチでは、このソリューションには冗長性の問題と、VS EF Designer の [プロパティ] ツールバーとデータベースからのメタデータとの同期の問題も含まれる場合があります。

4

1 に答える 1

2

これは開始に役立つはずですが、必要なものを取得するには、デバッガーにアクセスして特にテストする必要があります...

サンプルコード...

using (var db = new MyContext())
{
var objectContext = ((IObjectContextAdapter)db).ObjectContext;

var baseset = objectContext
    .MetadataWorkspace
    .GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace)
    .BaseEntitySets
    .First(meta => meta.ElementType.Name == "YourEntityClassName");

var elementType = objectContext
    .MetadataWorkspace
    .GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace)
    .BaseEntitySets
    .First(meta => meta.ElementType.Name == "YourEntityClassName")
    .ElementType;

EdmMember member = elementType.Members[2];

Facet item;
// if (member.TypeUsage.Facets.TryGetValue(EdmProviderManifest.StoreGeneratedPatternFacetName, false, out item))
if (member.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out item))
{
    var value = ((StoreGeneratedPattern)item.Value) == StoreGeneratedPattern.Computed;
}

しかし、それは話のほんの一部です。

私が気付いたのは、必要なものに応じて、場合によっては機能することです (したがって、少し実験する必要があります)。しかしother spaces、そこにもあります - 例えばSSpace. たとえば、テーブル名の場合、これはより適切に機能します...

var ssSpaceSet = objectContext.MetadataWorkspace.GetItems<EntityContainer>(DataSpace.SSpace).First()
    .BaseEntitySets
    .First(meta => meta.ElementType.Name == "YourTableName");

...そして私有地Table

あなたの場合、ほとんどの情報がそこにあるはずです-しかし、たとえば、生成された上記のストアはそこに入力されていません-しかし、他の「スペース」にあると思います(そのリンクの1つにもっとあります)。

そして、次のリンクを見てください。



CreateDatabase をサポートしていないプロバイダーを使用してプログラムでデータベースを作成するためのモデル スキーマを取得する
プロパティがORMモデルで計算済みとしてマークされていることを単体テストで確認するにはどうすればよいですか?

于 2013-04-09T20:26:56.360 に答える