8

Если во-первых, мы используем [MetadataType(typeof(ConceptMetadataSource))] для присоединения файла данных метаданных, который содержит все аннотации данных, такие как [HiddenInput(DisplayValue = false)] или [Display(Name = "Title")].Как добавить аннотацию данных для объектов, автоматически созданных 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 Concept, сгенерированный DbContext, все, что нам нужно сделать, это создать новый, начатый с public partial class Concept. Этот новый частичный класс может быть создан в другой папке, но нам нужно, чтобы его пространство имен было обновлено так же, как и автоматически сгенерированный частичный класс.

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

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

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

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

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

+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

Второй раздел по-прежнему добавляет атрибут [MetadataType] в классе Concept. Предполагается, что это 'public partial class VMConcept {}'? – Blaise

12

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