2012-04-06 12 views
9

Sto facendo il mio primo progetto con EF e sto pensando di andare al modello in codice prima. Sto provando a trovare un po 'di guida sulla gestione di uno scenario di "lookup table" abbastanza classico.Best practice per le tabelle di ricerca in codice EF-First

Ho a che fare con una situazione piuttosto canonica in cui conserverò i dati dell'indirizzo. Così, ho un semplice indirizzo DTO ...

public class Address 
    { 
     public int Id { get; set; } 
     public virtual string StreetAddress1 { get; set; } 
     public virtual string StreetAddress2 { get; set; } 
     public virtual string City { get; set; } 
     public virtual string State { get; set; } 
     public virtual string ZipCode { get; set; } 
    } 

Nella proprietà dello stato, mi piacerebbe per memorizzare il codice di stato di Stati Uniti di due lettere standard. Per motivi di convalida, mi piacerebbe avere una relazione di chiave esterna uno-a-molti tra la tabella degli indirizzi risultante e una tabella di ricerca di stato abbastanza standard. Quella tabella probabilmente conterrebbe un ID, il codice di due lettere e una terza colonna per contenere il nome completo dello stato.

Mi aspetterei di utilizzare questa tabella di ricerca di stato per compilare e indicare caselle di stile a discesa, ecc. E anche fungere da convalida allo stato archiviato nell'entità indirizzo. Roba abbastanza comune Quindi, ho un paio di semplici (spero) domande.

  1. ho bisogno di creare un'entità che rappresenti l'ente statale solo per aver EF creare la tabella, o posso semplicemente includere la tabella per la creazione processo in una strategia DBCreation e seminare lì?
  2. avrebbe senso per creare tale entità, proprio da utilizzare come "vista modelli" per qualsiasi posto dove vorrei per visualizzare uno "stato-picker"
  3. ho davvero solo voglia di memorizzare il codice di stato di due lettere nell'indirizzo entità, ma questo ha senso o ha più senso solo a renderlo una proprietà di navigazione per un'entità di stato e quindi visualizzare?

Ho faticato un po 'con l'articolare il mio punto qui, quindi se non sono chiaro, sentitevi liberi di chiedere maggiori dettagli.

Grazie in anticipo. in modo appropriato nell'interfaccia utente?

+0

3- Io personalmente uso un'entità per questo solo perché può evitare gli errori tipografici degli utenti. Garantisco anche la coerenza se la usi in molte entità (ora o più tardi). Ma se la tua applicazione è abbastanza piccola o non hai bisogno di troppe convalide, non vedo molte controindicazioni per mettere direttamente le due lettere direttamente nella tua entità Indirizzo. – Mathieu

risposta

7
  1. vorrei fare lo Stato è di possedere classe e una proprietà di navigazione del Indirizzo.
public class Address 
{ 
    public int Id { get; set; } 
    public virtual string StreetAddress1 { get; set; } 
    public virtual string StreetAddress2 { get; set; } 
    public virtual string City { get; set; } 
    public virtual USState State { get; set; } 
    public virtual string ZipCode { get; set; } 
} 

public class USState 
{ 
    public int Id { get; set; } 
    public string Code { get; set; } 
    public string Text { get; set; } 
} 

Con il codice prima EF sarà creare la tabella, ma è possibile compilarlo nel metodo Seed().

  1. Non è necessario utilizzare i modelli di visualizzazione, ma è consigliabile utilizzare una visualizzazione condivisa per visualizzare gli stati in un modulo di modifica. Non si parla di MVC, ma se si utilizza questo, poi è semplice come mettere
[UIHint("StatePicker")] 
public virtual USState State { get; set; } 

nel modello POCO o vista - a seconda di cosa utilizza la vista. Poi, nel Visualizzazioni/Shared/EditorTemplates, aggiungere una vista parziale StatePicker.cshtml, che sarebbe looke qualcosa come

@inherits System.Web.Mvc.WebViewPage<USState> 
@Html.DropDownListFor(m => m, new SelectList((IEnumerable<USState>)ViewBag.USStatesAll, 
    "Id", 
    "Name", 
    Model==null?1:Model.Id), 
    "Choose--") 

in combinazione con

@Html.EditorFor(m => m.State) 

nella vista.

  1. Proprietà di navigazione. Il tuo db memorizzerà l'ID USState come una chiave esterna, ma la tua app può utilizzare addr.State.Code o addr.State.Text, a seconda delle necessità. È molto più flessibile
+0

Cosa succede se si utilizza ViewModels? Ho provato l'approccio sopra e non sembra funzionare? Come dovrei mappare tra l'ID e l'entità di ricerca sull'oggetto? – Burt

+0

@Burt Il mio esempio sopra non è completo, ma la tecnica funzionerà per usare un viewmodel o direttamente usando il modello. Prima con il codice EF, il framework esegue la mappatura per te. Posso trovare una buona (e più recente) introduzione a EF e MVC [qui] (http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity -modello -Framework-dati-per-un-asp-net-mvc-applicazione) –

1
  1. Sì, è possibile solo creare un nuovo script DBCreation estendendo la sceneggiatura originale e creare una tabella di stato, che non ha alcuna relazione con Entity Framework.

  2. Se fossi in te, creerei l'entità statale. Se l'entità di stato non viene creata, alla fine è necessario crearla nel codice, ma la compilazione di questa entità sarà un problema, sarà necessario utilizzare sql (è possibile memorizzare questi dati in xml che sembra un'opzione migliore rispetto all'archiviazione in SQL).

  3. Se si decide di memorizzare la tabella nel database e utilizzarla direttamente creando un'entità, impostarla come proprietà di navigazione è un'opzione migliore poiché è possibile utilizzarla direttamente durante il caricamento lento o il caricamento ansioso includendolo.