Как добавить аннотацию данных для сущностей, автоматически созданных Data-First?
Если сначала модель, мы используем [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>
//------------------------------------------------------------------------------
Поскольку код будет регенерирован после того, как мы изменим таблицу в базе данных, аннотации данных будут стираться при каждой регенерации классов сущностей.
Может кто-нибудь сказать мне, что является лучшим способом аннотировать эти классы сущностей? Спасибо.
3 ответа
Хорошо, вот ответ.
Хитрость в том, что автоматически генерируемые классы являются частичными классами. Процесс компиляции объединит все частичные классы с одинаковыми именами.
Если у нас есть public partial class Concept
создано DbContext
все, что нам нужно сделать, это создать еще один, начатый с public partial class Concept
, Этот новый частичный класс может быть создан в другой папке, но нам нужно, чтобы его пространство имен было обновлено так же, как автоматически сгенерированный частичный класс.
В этот недавно созданный частичный класс мы можем добавить все виды аннотаций данных, таких как
[Required(ErrorMesssage="This Field is required")]
Или мы можем даже добавить новые свойства, такие как
FullName {get {return string.Format("{0} {1}", FirstName, LastName);}}
Если модель снова обновляется из базы данных, будут обновляться только автоматически созданные частичные классы. Те недавно добавленные частичные классы, которые содержат наши аннотации и другие манипуляции, останутся без изменений.
Все, что вам нужно сделать, это создать еще один частичный класс и использовать атрибут 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; }
}
}
Определить модель вида как
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;}
}