Как добавить аннотацию данных для сущностей, автоматически созданных Data-First? - PullRequest
8 голосов
/ 19 января 2012

Если сначала модель, мы используем [MetadataType(typeof(ConceptMetadataSource))], чтобы прикрепить файл источника метаданных, который содержит все аннотации данных, такие как [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>
//------------------------------------------------------------------------------

Поскольку код будет обновлен после того, как мы изменим таблицу в базе данных, аннотации данных будут стираться каждый раз, когда сущностьклассы возрождаются.

Может кто-нибудь сказать мне, как лучше всего аннотировать эти классы сущностей?Спасибо.

Ответы [ 3 ]

12 голосов
/ 06 февраля 2013

Все, что вам нужно сделать, это создать еще один частичный класс и использовать атрибут 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; }
    }
}
6 голосов
/ 07 мая 2012

Хорошо, вот ответ.

Хитрость в том, что автоматически генерируемые классы являются частичными классами.Процесс компиляции объединит все частичные классы с одинаковыми именами.

Если у нас есть public partial class Concept, сгенерированный DbContext, все, что нам нужно сделать, это создать еще один, начатый с public partial class Concept.Этот новый частичный класс может быть создан в другой папке, но нам нужно, чтобы его пространство имен было обновлено так же, как автоматически сгенерированный частичный класс.

В этот вновь созданный частичный класс мы можем добавить все видыаннотаций данных, таких как

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

Или мы можем даже добавить новые свойства, такие как

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

Если модель снова обновляется из базы данных, только автоматически сгенерированные частичные классыбудет обновлено.Те недавно добавленные частичные классы, которые содержат наши аннотации и другие манипуляции, останутся без изменений.

0 голосов
/ 19 января 2012

определяет модель вида как

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;}
}
...