0

プロジェクトでEF 4.1「データベースファースト」を使用しています。T4 テンプレートを使用して、生成されたプロパティを Required、DisplayName、MaxLength などの属性で条件付きで装飾しています。T4 テンプレートの WriteProperty メソッド内には、次のようなものがあります。

var maxLength = edmProperty.TypeUsage.Facets.Where(f => f.Name == "MaxLength").FirstOrDefault();
if (maxLength != null && maxLength.Value.ToString() != "Max")
{#>
    [MaxLength(<#= maxLength.Value #>, ErrorMessage = "<#=edmProperty.Documentation != null ? edmProperty.Documentation.LongDescription : edmProperty.Name #> cannot exceed <#=maxLength.Value #> characters.")]
<#+}

これは、edmx から推測できる情報に対してはうまく機能しますが、カスタムで単に利用できないものもあります。

EmailAddress例として、カスタムの正規表現型属性でプロパティを装飾したいとします。モデル内の電子メール アドレス フィールドを自動的に「選別」し、プロパティの名前を確認せずにこの属性を適用するにはどうすればよいですか?

おそらく EdmProperty を「拡張」して、IsEmailAddress などのカスタム プロパティを追加する方法はありますか?

ありがとう!

4

2 に答える 2

1

私はあなたが(一種の)それを行うことができると思います. 私はこれを試していませんが、名前空間の属性を Edmx ファイルに追加すると、メタデータ プロパティを介してアクセスできると思います。このようなもの:

<Property Name="ID" Type="Int32" Nullable="false" myNs:regex="xxx" xmlns:myNs="http://tempuri.org" />

次に、次のように値を読み取ることができます (EdmProperty がある場合)。

var metadata = edmProperty.MetadataProperties.Single(p => p.Name == "http://tempuri.org:regex");
Console.WriteLine(metadata.Value);

ここでの唯一の問題は、データベースからモデルを更新するたびに edmx ファイルが上書きされ、edmx ファイルに追加した注釈が失われる可能性があることです。

于 2013-03-12T16:37:33.630 に答える
0

いいえ、何もありません。EFモデル設計者は、検証のためであっても、カスタムメタデータを使用してモデルを拡張することはできません。もちろん、命名規則を試すことも、車輪の再発明をして独自のメタデータファイルを追加することもできますが、今のところ簡単な方法は、部分クラスの検証属性とメタデータタイプを手動で記述することです。

私は間違いなくEFにこの機能を追加することに投票します。

于 2013-03-12T13:16:49.443 に答える