2012-01-14 11 views
2

私たちのアプリケーションで自動生成されたクラスにMetadataTypeを添付できません。 私は生成されたクラスのOrder属性を設定してテストしても問題なく動作しますが、別のクラスを使用しようとすると後で属性を取得できません。DataAnnotations MetadataTypeが機能しない

私は既に解決策を試してみましたが、hereは成功しませんでした。

生成されたクラスは

[Table(Name = "T_MKT_Product")] 
public partial class T_MKT_Product : GlobalSist.DataAccess.Base.BaseEntity 
{ 
    [Column(Storage = "_code", DbType = "varchar(20)", IsUnique = true)] 
    public virtual string Code 
    { 
     get { return _code; } 
     set 
     { 
      if (_code != value) 
      { 
       OnPropertyChanging("Code"); 
       _code = value; 
       OnPropertyChanged("Code"); 
      } 
     } 
    } 

    [Column(Storage = "_name", DbType = "varchar(200)")] 
    public virtual string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       OnPropertyChanging("Name"); 
       _name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 
    } 

    [Column(Storage = "_description", DbType = "varchar(200)", CanBeNull = true)] 
    public virtual string Description 
    { 
     get { return _description; } 
     set 
     { 
      if (_description != value) 
      { 
       OnPropertyChanging("Description"); 
       _description = value; 
       OnPropertyChanged("Description"); 
      } 
     } 
    } 
} 

は、私は以下のクラス

[MetadataType(typeof(ProductMetaData))] 
public partial class T_MKT_Product 
{ 
} 

public class ProductMetaData 
{ 
    [Display(Order = -1)] 
    public virtual string Code { get; set; } 

    [Display(Order = -2)] 
    public object Name { get; set; } 

    [Display(Order = -3)] 
    public object Description { get; set; } 
} 

ヘルプを定義しました! :)

+0

ここでは複雑すぎます。属性を機能させるまでコードを単純化すると、問題が見つかります。 EFなしで1つのフィールドを持つ同じクラスを作成します。 – RickAndMSFT

+0

これを確認してください、私は既にこの質問にここで答えました http://stackoverflow.com/a/24757520/3050647 – elia07

答えて

2

は、ITがFALSEでなければなりません まだFalseです。おそらくあなたはカスタムコードで注文をチェックしているでしょう!あなたの問題への答えは非常に簡単です:カスタムコードは間違っているだけです。メタデータ・クラスで追加された属性がクラスの他のすべての「ネイティブ」属性とともに検出されているように思われるため、おそらく間違っています。これは間違っています! .Net ClrはMetaDataType属性のためのサポートがありません!条約はただの条約です。クラスにはMetaDataTypeがあり、元のクラスのプロパティと同じ名前のMetaDataTypeの属性も取得するのはあなた次第です。 私はあなたがこの仕事を手動で行うことを意味します。 Mvcエンジンが自動的に処理するすべての属性は、このように処理されます。つまり、MvcエンジンはMetaDataTypeの属性を調べ、それらをネイティブ属性とマージします。カスタムコードで同じことをしなければなりません。

ビューに属性が必要な場合は、属性を手動で取得する代わりに、カスタムMetaDataProviderを記述します。メタデータプロバイダのロジックは、すべての属性(私が説明した方法)を自動的に検索します。それぞれの属性を取るために必要なアクションを指定するだけで済みます。

+0

あなたの説明をありがとう。それは私がやったことです(私はこれが自動的にできなかったことを知らなかったが)。 –

4

自動生成されたクラスが定義されている名前空間が、カスタム部分クラスを定義した名前空間と同じであることを確認してください。たとえば:

namespace FooBar 
{ 
    [Table(Name = "T_MKT_Product")] 
    public partial class T_MKT_Product : GlobalSist.DataAccess.Base.BaseEntity 
    { 
     ... 
    } 
} 

とあなた:(currentProp、typeof演算(DisplayAttribute))Attribute.IsDefined

namespace FooBar 
{ 
    [MetadataType(typeof(ProductMetaData))] 
    public partial class T_MKT_Product 
    { 
    } 

    public class ProductMetaData 
    { 
     [Display(Order = -1)] 
     public virtual string Code { get; set; } 

     [Display(Order = -2)] 
     public object Name { get; set; } 

     [Display(Order = -3)] 
     public object Description { get; set; } 
    } 
} 
+0

私はすでにそれを試みましたが、問題を解決しません。 Attribute.IsDefined(currentProp、typeof(DisplayAttribute))はまだFalseです –

+0

@Darin Dimitrov -----どちらが真です:1)両方のクラスが同じ名前でなければならない、2)名前空間が同じである必要があります。 3)両方のクラスは部分的でなければならない、4)すべてが真でなければならない。 –