8

モデルの場合、[MetadataType(typeof(ConceptMetadataSource))]を使用して、[HiddenInput(DisplayValue = false)]または[Display(Name = "Title")]のようなすべてのデータ注釈を含むMetadataSourceファイルを添付します。Data-Firstによって自動的に作成されたエンティティにデータアノテーションを追加するにはどうすればよいですか?

たとえば

:今

[MetadataType(typeof(ConceptMetadataSource))] 
public partial class Concept 
... 

、既存のデータベースがあるので、私は、データベースの最初のアプローチを使用しています。今回は、エンティティクラスはedmxモデルによって自動的に作成されます。私たちは、データベース内のテーブルを変更した後、コードは、データの注釈は、エンティティ・クラスがあるたびに一掃され、再生成されますので

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

:各エンティティクラスの開始時に、以下のコメントの行があります再生された。

これらのエンティティクラスに注釈を付ける最も良い方法は何ですか?ありがとうございました。

+0

を次のコードを追加しているあなたは、まだブレーズを解決策を発見しましたか? – reidLinden

+0

はい@reidLinden、部分クラスを使用します。 – Blaise

+0

この質問を閉じるにはどうすればよいですか?その答えは良いものではなく、私はすでに解決策を持っています。 – Blaise

答えて

6

ようなビューモデルを定義さて、ここでの答えがあります。

トリックは、自動生成されたクラスはすべて部分クラスです。コンパイルプロセスは、すべての部分クラスを同じ名前で結合します。

public partial class ConceptDbContextで生成されている場合は、public partial class Conceptで始まる別のものを作成するだけです。この新しい部分クラスは別のフォルダに作成できますが、名前空間を自動生成された部分クラスと同じに更新する必要があります。

この新しく作成された部分クラスでは、我々はそのようなモデルが更新されると私たちも、

FullName {get {return string.Format("{0} {1}", FirstName, LastName);}} 

のような新しいプロパティを追加することができます

[Required(ErrorMesssage="This Field is required")] 

か、などのデータのアノテーションのすべての種類を追加することができます再度データベースから自動的に生成された部分クラスだけが更新されます。注釈やその他の操作を含む新たに手動で追加された部分クラスは、そのまま残されます。

+0

優秀、ありがとう! – reidLinden

0

public class VMConcept 
{ 
    public Concept NewConcept {get; set;} 
} 

[MetadataType(typeof(ConceptMetadataSource))] 
public partial class Concept{} 

public class ConceptMetadataSource { 

[Required(ErrorMesssage="This Field is required")] 
public string PropertyName {get; set;} 
} 
+0

返信いただきありがとうございます。しかし難しい点は、Conceptテーブルを修正した後は、Concept.csが再作成されることです。また、すべての注釈属性が削除されます。 あなたは本当にそれらを書いていましたか?]タグはedmxによって生成されたクラスの中にありますか? – Blaise

+0

'edmx'のクラスではないので、答えを更新し、' Concept'型のプロパティを持つビューモデルを定義しています... –

+0

2番目のセクションは、Conceptクラスの[MetadataType]属性を追加します。それは 'public partial class VMConcept {}'であるはずですか? – Blaise

12

あなたがしなければならないのは、別の部分クラスを作成し、メタ属性の属性を使用することだけです。ここでは、サンプルコード

//This is generated by EDMX 

namespace DataLayer 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Customer 
    { 
     public Customer() 
     { 
      this.CustomerAddresses = new HashSet<CustomerAddress>(); 
      this.CustomerOrders = new HashSet<CustomerOrder>(); 
     } 

     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string EmailId { get; set; } 


     public Nullable<System.DateTime> DateOfBirth { get; set; } 

     public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; } 
     public virtual ICollection<CustomerOrder> CustomerOrders { get; set; } 
    } 
} 

は手動

namespace DataLayer 
{ 
    [MetadataType(typeof(CustomerMetaData))] 
    public partial class Customer 
    { 

    } 
    public class CustomerMetaData 
    { 
     [StringLength(10, ErrorMessage = "First name must be 25 characters or less in length.")] 
     [Required(ErrorMessage = "First name is required.")] 
     public String FirstName { get; set; } 
    } 
} 
関連する問題