2

DataAnnotationフレームワークと連携して、新しいEntityFramework 4.1とPOCOオブジェクトを使用しています。POCO Entity Framework 4を使用するとデータアノテーションが失われる

EntityFrameworkでプロキシクラス(遅延ロード仮想プロパティなど)を作成する必要がある場合、すべてのデータ注釈が失われます。私のModelMetaDataが、プロキシクラスではなくプロキシされたクラスから来ることができる方法はありますか?

私はプロキシ作成(context.Configuration.ProxyCreationEnabled)を無効にする選択肢があることを知っていますが、これは貧弱な答えのようです。これは解決されたものでなければならないと思います。ここで

は、いくつかのサンプルコードです:

public class Person 
{ 
    [Required, Display(Name = "Display That Name")] 
    public string DisplayName { get; set; } 
} 

そしてビューの私のモデルのメタデータで、タイプは次のとおりです。Person_9C92B92D56F6F4F0FB1686526D585438A05323CC72E457C2152796E8866297E1 (FullName = "System.Data.Entity.DynamicProxies.Person_9C92B92D56F6F4F0FB1686526D585438A05323CC72E457C2152796E8866297E1"})、私のメタデータがなくなって、DisplayNameおよびその「表示名」ではない」の表示で出てレンダリングされます名"。

提案がありますか?

答えて

0

私は可能な解決策を考え出しました。より良いものがあるかどうかは分かりません。まず、私は新しいModelMetadataProvider書いた:

public class IgnoreProxiesDataAnnotationsModelMetadataProvider : System.Web.Mvc.DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     modelType = ObjectContext.GetObjectType(modelType); 
     containerType = ObjectContext.GetObjectType(containerType); 

     return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
    } 
} 

をそしてGlobal.asaxのアプリケーションの起動でそれを登録:よりよい解決策がある場合

ModelMetadataProviders.Current = new IgnoreProxiesDataAnnotationsModelMetadataProvider(); 

、私に知らせてください!次のように我々は何をすべきか

+0

public partial class Person { public int idPerson { get; set; } public int idTenant { get; set; } public string Name { get; set; } } 

その後は、メタデータを保持してオーバーライドされることはありませんメタデータクラスを作ることができますObjectContext.GetObjectTypeを使用するのが「少し」簡単にプロキシされました。 – jamie

+0

@jamieありがとう、私はちょうどあなたの提案を使用するように編集! –

1

は次のとおりです。

はあなたのエンティティの部分クラスを生成するために、T4テンプレートを変更します。

アノテーションを追加するエンティティでは、エンティティの同じ名前の部分クラスを作成します。

アノテーションの詳細を提供するこのクラス内にバディークラスを作成します。

パーシャルクラスの上部に属性を適用して、バディークラスがアノテーションの詳細が見つかる場所を指定します。

は、あなたがあなたのモデルクラスのメタデータのバージョンを作ることができ、より詳細http://msdn.microsoft.com/en-us/library/ee256141.aspx

6

についてはこちらを参照してください。 EFが生成するものは決して手で触れることはありません。

レッツはあなたがPersonクラスを持って言った:タイプがあるかどうかを判断するには

[MetadataType(typeof(PersonMD))] 
    public partial class Person 
    { 
     //leave it empty 
    } 

    public partial class PersonMD 
    { 
     [Required] 
     public int idPerson { get; set; } 

     [Required] 
     public int idTenant { get; set; } 

     [Required, Display(Name = "Display That Name")] 
     public string Name { get; set; } 
    } 
関連する問題