8

Jeśli używamy najpierw modelu, używamy [MetadataType(typeof(ConceptMetadataSource))] do dołączenia pliku MetadataSource zawierającego wszystkie adnotacje danych, takie jak [HiddenInput(DisplayValue = false)] lub [Display(Name = "Title")].Jak dodać adnotacje danych dla podmiotów automatycznie tworzonych przez Data-First?

Na przykład:

[MetadataType(typeof(ConceptMetadataSource))] 
public partial class Concept 
... 

Teraz używam pierwszego podejścia do bazy danych, ponieważ nie jest istniejąca baza danych. Tym razem klasy encji są automatycznie tworzone przez model edmx. Na początku każdej klasy podmiotu, nie ma linii komentarzu poniżej:

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

Ponieważ kod będzie regenerowany raz zmodyfikować tabelę w bazie danych, adnotacje danych zostaną każdorazowo klasy podmiotu są wymazane zregenerowany.

Czy ktoś może mi powiedzieć, jaka jest najlepsza metoda opisywania klas jednostek? Dziękuję Ci.

+0

znalazłeś jeszcze rozwiązanie, Blaise? – reidLinden

+0

Tak @reidLinden, użyj klasy częściowej. – Blaise

+0

Jak mogę zamknąć to pytanie? Ta odpowiedź nie jest dobra i już mam rozwiązanie. – Blaise

Odpowiedz

6

Dobra, tu jest odpowiedź.

Sztuczka polega na tym, że automatycznie generowane klasy są klasami częściowymi. Proces kompilacji połączy wszystkie klasy cząstkowe o tej samej nazwie.

Jeśli mamy public partial class Concept wygenerowany przez DbContext, wszystko, co musimy zrobić, to stworzyć kolejną rozpoczętą z public partial class Concept. Ta nowa klasa częściowa może być utworzona w innym folderze, ale musimy jej przestrzeń nazw powinna zostać zaktualizowana do tej samej, co automatycznie wygenerowana klasa częściowa.

W tym nowo utworzonym częściowej klasy, możemy dodać różnego rodzaju danych-adnotacje, takie jak

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

Albo, możemy nawet dodać nowe właściwości jak

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

Jeśli model jest aktualizowana ponownie z bazy danych, tylko automatycznie wygenerowane klasy częściowe zostaną zaktualizowane. Te nowo dodane ręcznie częściowe klasy, które zawierają nasze adnotacje i inne manipulacje pozostaną nienaruszone.

+0

świetnie, dzięki! – reidLinden

0

zdefiniowanie modelu widok jak

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

Dzięki za odpowiedź, John. Ale trudność polega na tym, że po zmodyfikowaniu tabeli Concept, Concept.cs zostanie odtworzony. Wszystkie atrybuty adnotacji zostaną usunięte. Naprawdę napisałeś te [wymagane ...] znaczniki wewnątrz klas generowanych przez edmx? – Blaise

+0

no nie w klasach przez 'edmx', mam zaktualizowaną odpowiedź, zdefiniuj model widoku, który będzie miał właściwość typu' Concept' ... –

+0

Druga sekcja nadal dodaje atrybut [MetadataType] w klasie Concept. Czy ma to być "public partial class VMConcept {}"? – Blaise

12

Wszystko, co musisz zrobić, to stworzyć kolejną klasę cząstkową i użyć atrybutu metadatatype. Oto przykładowy kod

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

Dodaj następujący kod ręcznie

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