14

EFは、ファイルに追加したテーブルに基づいてクラスを生成することを知ってい.edmxます。これは、それらの[DisplayName]DataAnnotationsにはなりません。

生成されたクラスのこの[DisplayName]を変更せずに追加するにはどうすればよいですか?.edmxデータベースが変更された場合にファイルを変更(変更されたテーブルを再追加)すると、生成されたクラスがオーバーライドされる可能性があるためです。したがって、生成クラス自体を変更したくありません。

EF生成クラス

 public partial class Committee
    {
        public string Committee_Description { get; set; }
        public byte[] Committee_Id { get; set; }
        public string Rn_Descriptor { get; set; }
        public Nullable<System.DateTime> Rn_Create_Date { get; set; }
       ......
       .....

意見

 <tr>
            <th>
                @Html.DisplayNameFor(model => model.Item2.GetEnumerator().Current.Committee_Name)
            </th>
4

3 に答える 3

14

メタデータクラスを使用し、MetadataTypeAttributeを介してエンティティクラスにアタッチします。メタデータクラスのプロパティでデータアノテーション属性を指定します(上記のプロパティの実装はありません)。

MSDN: http: //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

編集:最初の落とし穴は、MetadataTypeAttributeをアタッチするために定義する部分クラスの名前空間です。同じクラスを定義するように、その名前空間を元のエンティティで使用されている名前空間に変更してください。

于 2013-03-25T20:41:52.867 に答える
5

テンプレートの.ttファイルを変更できます。このファイルは、モデルのDocumentationプロパティを使用して必要な属性を持つクラスを生成するためのクラスコードを生成します。たとえば、EF5の場合、*Model.ttメソッドで次のように置き換えることができますCodeStringGenerator.Property()

public string Property(EdmProperty edmProperty)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{5} {0} {1} {2} {{ {3}get; {4}set; }}",
        Accessibility.ForProperty(edmProperty),
        _typeMapper.GetTypeName(edmProperty.TypeUsage),
        _code.Escape(edmProperty),
        _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
        _code.SpaceAfter(Accessibility.ForSetter(edmProperty)),
        (edmProperty.Documentation == null ? "" : ("[Display(Name=\""+edmProperty.Documentation.Summary+"\")]"+Environment.NewLine+"   ")));
}

そしてCodeStringGenerator.UsingDirectives()と:

public string UsingDirectives(bool inHeader, bool includeCollections = true)
{
    return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
        ? string.Format(
            CultureInfo.InvariantCulture,
            "{0}using System;{1}" +
            "{2}{3}",
            inHeader ? Environment.NewLine : "",
            includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
            inHeader ? "" : Environment.NewLine,"using System.ComponentModel.DataAnnotations;"+Environment.NewLine)
        : "";
}

その後Documentation.Summary、モデルとテンプレートにプロパティを設定します。.ttは、メタデータクラスを使用せずに、適切な属性を持つすべてのクラスを生成し、MetadataTypeAttributeを介してエンティティクラスにアタッチします。例えば:

namespace DataAdmin.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class Discount
    {
        public Discount()
        {
            this.DiscountPeriods = new HashSet<DiscountPeriod>();
            this.Clinics = new HashSet<Clinic>();
            this.Doctors = new HashSet<Doctor>();
            this.Servs = new HashSet<Serv>();
        }

        public int DiscountKey { get; set; }
        [Display(Name="Discount name")]
        public string Name { get; set; }
        public string MisCode { get; set; }
        public string MisName { get; set; }
        public string MisDesc { get; set; }
        public decimal Perc { get; set; }
        public int Rang { get; set; }
        public Nullable<int> DiscountTypeKey { get; set; }

        public virtual ICollection<DiscountPeriod> DiscountPeriods { get; set; }
        public virtual ICollection<Clinic> Clinics { get; set; }
        public virtual ICollection<Doctor> Doctors { get; set; }
        public virtual ICollection<Serv> Servs { get; set; }
        public virtual DiscountType DiscountType { get; set; }
    }
}
于 2014-06-20T14:45:52.743 に答える
2

生成されたクラスは部分的なクラスであることに注意してください。したがって、同じ名前で別の部分クラスを作成し、それに注釈を付けることができます。次に、.edmxファイルを変更しても、2番目の部分クラスは更新されません。

MVCDBの詳細最初の修正表示名

于 2013-08-01T05:48:50.863 に答える