2012-04-06 60 views
9

我正在做EF和我的第一個項目,我打算去代碼優先模型。我試圖找到一些有關處理相當經典的「查找表」場景的指導。在EF代碼查找表的最佳實踐 - 首先

我正在處理一個漂亮的規範情況,我將堅持地址數據。所以,我有一個簡單的地址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; } 
    } 

在國家財產,我想存儲標準的美國雙字母國家代碼。出於驗證目的,我希望在生成的Address表和一個相當標準的狀態查找表之間有一個標準的一對多外鍵關係。該表可能包含一個ID,雙字母代碼和第三列以包含完整的狀態名稱。

我希望使用這種狀態查找表來填充和狀態下拉式樣框等,也充當地址實體中提交的州的驗證。相當普遍的東西。所以,我有幾個簡單的問題(我希望)。

  1. 我需要建立代表國家的實體正好 有EF創建表的實體,或者我可以只包括在DBCreation策略表創建 過程和種子它呢?
  2. 會是有意義的創建實體,只爲用「視圖 典範」,我想顯示「狀態選取器」
  3. 我真的只想要存儲的兩個字母的國家代碼的任何地方在地址 實體,但這是否有意義,或者它是否更有意義,只要 使它成爲一個狀態實體的導航屬性,然後顯示?

我在這裏闡述了我的觀點,我掙扎了一下,所以如果我不清楚,請隨時索要更多的細節。

在此先感謝。 在UI中適當嗎?

+0

3-我個人使用的實體只是因爲它可以避免用戶的印刷錯誤。如果你在許多實體中使用它(現在或以後),我也保證一致性。但是,如果你的應用程序相當小或者你不需要太多的驗證,我沒有看到太多的反指示,直接將這兩個字母直接放在Address實體中。 – Mathieu 2012-04-06 14:53:43

回答

7
  1. 我會做出自己的階級狀況和地址的導航屬性。
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; } 
} 

隨着代碼首先EF將創建表,但你可以在Seed()方法填充它。

  1. 您不一定需要使用視圖模型,但使用共享視圖來顯示編輯表單中的狀態是有意義的。你不提MVC,但如果您使用的,那麼它的那樣簡單把
[UIHint("StatePicker")] 
public virtual USState State { get; set; } 

在POCO或視圖模型 - 這取決於你的視圖使用。然後在查看/共享/ EditorTemplates,添加一個局部視圖StatePicker.cshtml,這將結合looke像

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

@Html.EditorFor(m => m.State) 
在你看來

  1. 導航屬性。您的數據庫將存儲USState ID作爲外鍵,但您的應用程序可以使用addr.State.Code或addr.State.Text,具體取決於需要。它更加靈活。
+0

如果您使用ViewModels會怎麼樣?我試過上面的方法,它似乎不工作?我將如何在Id和對象上的查找實體之間進行映射? – Burt 2014-10-12 13:05:54

+0

@Burt我上面的示例並不完整,但該技術可用於使用視圖模型或直接使用模型。首先使用EF代碼,框架爲您做映射。我對EF和MVC的介紹很好(也是最近的)可以在這裏找到[http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity -framework數據模型換一個-ASP淨MVC施用) – 2014-10-13 13:24:29

1
  1. 是的,你可以創建一個新的DBCreation腳本來擴展原始腳本並創建一個與實體框架無關的狀態表。

  2. 如果我是你,我會創建狀態實體。如果狀態實體沒有被創建,最後你需要在代碼中創建它,但是填充這個實體將是一個問題,你將需要使用sql(你可以將這些數據存儲在xml中,這比存儲在SQL)。

  3. 如果您決定將表存儲在數據庫中,並通過創建實體直接使用它,使其成爲導航屬性是一個更好的選擇,因爲您可以直接使用它,而延遲加載或通過包含它進行加載加載。