EntityFramework T4 テンプレートによって自動的に生成されたこの POCO クラスがあるとします (手動で編集することはできません)。
public partial class Customer
{
[Required]
[StringLength(20, ErrorMessage = "Customer Number - Please enter no more than 20 characters.")]
[DisplayName("Customer Number")]
public virtual string CustomerNumber { get;set; }
[Required]
[StringLength(10, ErrorMessage = "ACNumber - Please enter no more than 10 characters.")]
[DisplayName("ACNumber")]
public virtual string ACNumber{ get;set; }
}
「ACNumber」は不適切な名前のデータベース フィールドであるため、自動生成機能は正しい表示名とエラー メッセージ (「Account Number」である必要があります) を生成できないことに注意してください。
したがって、このバディ クラスを手動で作成して、自動生成できなかったカスタム属性を追加します。
[MetadataType(typeof(CustomerAnnotations))]
public partial class Customer { }
public class CustomerAnnotations
{
[NumberCode] // This line does not work
public virtual string CustomerNumber { get;set; }
[StringLength(10, ErrorMessage = "Account Number - Please enter no more than 10 characters.")]
[DisplayName("Account Number")]
public virtual string ACNumber { get;set; }
}
[NumberCode] は、数字とハイフンのみを許可する単純な正規表現ベースの属性です。
[AttributeUsage(AttributeTargets.Property)]
public class NumberCodeAttribute: RegularExpressionAttribute
{
private const string REGX = @"^[0-9-]+$";
public NumberCodeAttribute() : base(REGX) { }
}
現在、ページをロードすると、DisplayName 属性が正しく機能します。生成されたクラスではなく、バディ クラスの表示名が表示されます。
StringLength 属性が正しく機能しません。生成されたクラスからのエラー メッセージが表示されます (「Account Number」ではなく「ACNumber」)。
しかし、バディ クラスの [NumberCode] 属性は AccountNumber プロパティに適用されません。
foreach (ValidationAttribute attrib in prop.Attributes.OfType<ValidationAttribute>())
{
// This collection correctly contains all the [Required], [StringLength] attributes
// BUT does not contain the [NumberCode] attribute
ApplyValidation(generator, attrib);
}
prop.Attributes.OfType<ValidationAttribute>()
コレクションに [NumberCode] 属性が含まれていないのはなぜですか? NumberCode は、ValidationAttribute を継承する RegularExpressionAttribute を継承するため、存在するはずです。
[NumberCode] 属性を自動生成されたクラスに手動で移動すると、prop.Attributes.OfType<ValidationAttribute>()
コレクションに含まれます。
だから私が理解していないのは、バディクラスの他の属性が機能しているときに、この特定の属性がバディクラスで機能しない理由です。そして、この属性が自動生成されたクラスでは機能するのに、バディでは機能しないのはなぜですか。何か案は?
また、StringLength が上書きされないのに、なぜ DisplayName がバディによって上書きされるのでしょうか?