2011-07-20 23 views
6

Używam MVC3 VS2010 z EF4.1, Stworzyłem mój DB przy użyciu SQL Server i importuję go do aplikacji sieciowej MVC3.Zaktualizuj model z bazy danych (baza danych)

Mam tu wyzwanie, kiedy przychodzę do Aktualizacji Modelu z Bazy Danych, utraciłem wszystkie moje modyfikacje plików modeli, na przykład jeśli używam atrybutów w niektórych modelach do sprawdzania poprawności lub tak, wszystko to jest nadpisywane nowym modelem nieruchomości.

Czy mimo to można zaktualizować model z bazy danych bez utraty informacji o modelach?

LUB

gdzie należy zdefiniować walidacji na moich modeli zamiast używać plików modelach bezpośrednio?

Odpowiedz

10

Aktualizacja: Ponieważ jest to nadal stosunkowo popularne, utworzyłem wpis na blogu na ten temat.

http://jnye.co/Posts/19/adding-validation-to-models-created-by-entity-framework-database-first-c

Jeśli chcesz sprawdzić swoje modele, a nie używać ViewModels, stosować częściowe klas do zdefiniowania atrybutów walidacji. Na przykład:

że masz model jak

public class User { 
    public string Name { get; set; } 
} 

Jeśli chcesz umieścić długości ciąg walidator na to trzeba by utworzyć klasę i częściowe wykorzystanie MetadataTypeAttribute (to żyje w System.ComponentModel .DataAnnotations)

Następujące klasy należy zdefiniować w osobnym pliku, NOT umieścić w tym samym pliku, co modele generowane automatycznie.

[MetadataTypeAttribute(typeof(UserMetadata))] 
public partial class User { 
} 

Następnie zdefiniować walidacji w klasie UserMetadata następująco

public class UserMetadata{ 
    [StringLength(50)] 
    public string Name {get; set;} 
} 

EDIT

Właśnie znalazłem ten artykuł, który opisuje rozwiązanie w nieco bardziej szczegółowo http://themonitoringguy.com/tips-tricks/validating-microsoft-entity-framework-objects-c-mvc/

+0

Więc za każdym razem model regenerowany muszę wrócić do każdego pliku i przedefiniować moje [MetadataTypeAttribute (typeof()] atrybut. Dziękuję @NinjaNye ale to nie jest praktyczne dla mnie. – Shadi

+0

Nie tylko Ty Konieczne jest zdefiniowanie sprawdzania poprawności dla nowej właściwości, która i tak będzie musiała być wykonana Częściowa klasa i klasa metadanych nie zostaną nadpisane lub zastąpione – NinjaNye

+0

Przepraszam, powinienem był uczynić to nieco jaśniejszym, zdefiniuj swoją klasę częściowej i metadanych w osobnej plik, NIE w pliku generowanym automatycznie. Zaktualizuję odpowiedź – NinjaNye

1

Pierwsza zasada każdego projektanta: generuje dowolny kod, którego nie można zmodyfikować, ponieważ zostanie całkowicie usunięty przy następnym uaktualnianiu czegokolwiek w projektancie.

Wszystkie wygenerowane klasy są częściowe, więc można utworzyć własną część częściową i umieścić tam niestandardową logikę. Oczywiście nie można dodawać atrybutów do właściwości zdefiniowanych w części generowanej automatycznie. W przypadku adnotacji danych jest to możliwe poprzez buddy classes lub niestandardowy szablon T4, który będzie zawierał własną logikę, aby zdecydować, która adnotacja danych powinna zostać dodana podczas generowania kodu. Oba scenariusze są najczęściej uważane za złe praktyki, ponieważ należy mieć osobny model widoku na widok z koniecznością sprawdzania poprawności dokładnie dla tego widoku.

2

Nie, pliki będą odtwarzane za każdym razem.

Wszystkie klasy są zdefiniowane jako częściowe, dzięki czemu można z łatwością dodać wartości danych za pomocą MetadataTypeAttribute.

Powiedzmy masz User klasę zdefiniowaną następująco:

public partial class User { 
    public string Name {get;set;} 
} 

utworzyć interfejs IUser

public interface IUser { 
    [Required] 
    [DisplayName("User name")] 
    string Name {get;set;} 
} 

A potem rozszerzyć klasę User aby określić, że IUser będą wykorzystywane jako metadane.

[MetadataType(typeof(IUser))] 
public partial class User {} //Empty class body 
+0

Dziękuję Bertand, ty i @NinjaNye dostarczył wielką pomoc. – Shadi

+0

Czy Metadata jest tutaj inaczej niż po prostu używając słowa kluczowego ':' do rozszerzenia interfejsu? –