9

モデル優先の場合、や など[MetadataType(typeof(ConceptMetadataSource))]のすべてのデータ注釈を含む MetadataSource ファイルを添付するために使用します 。[HiddenInput(DisplayValue = false)][Display(Name = "Title")]

例えば:

[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>
//------------------------------------------------------------------------------

データベース内のテーブルを変更するとコードが再生成されるため、エンティティ クラスが再生成されるたびにデータ注釈が消去されます。

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

4

3 に答える 3

13

別の部分クラスを作成し、metadatatype 属性を使用するだけです。サンプルコードはこちら

//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; }
    }
}
于 2013-02-06T15:55:31.737 に答える
6

さて、ここに答えがあります。

秘訣は、自動生成されたクラスはすべて部分的なクラスであるということです。コンパイルプロセスでは、すべての部分クラスが同じ名前で結合されます。

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

この新しく作成された部分クラスでは、次のようなあらゆる種類のデータ注釈を追加できます。

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

または、次のような新しいプロパティを追加することもできます

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

モデルがデータベースから再度更新されると、自動生成された部分クラスのみが更新されます。アノテーションやその他の操作を含む、新しく手動で追加された部分クラスはそのまま残ります。

于 2012-05-07T15:47:43.213 に答える
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;}
}
于 2012-01-19T19:48:47.330 に答える