EF Code-First中查找表的最佳实践

时间:2012-04-06 14:43:11

标签: c# entity-framework-4.1 poco code-first

我正在用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,两个字母的代码和一个包含完整州名的第三列。

我希望使用此状态查找表来填充和声明下拉样式框等,并且还可以作为对地址实体中提交的State的验证。相当常见的东西。所以,我有几个简单(我希望)的问题。

  1. 我是否需要创建一个实体来代表State实体 有EF创建表,或者我可以只包括表创建 在DBCreation策略中处理并在那里播种?
  2. 创建该实体是否有意义,只是用作“视图” 模型“用于我想要显示”状态选择器“的任何地方
  3. 我真的只想将两个字母的州代码存储在地址中 实体,但这是否有意义,或者它是否更有意义 使它成为状态实体的导航属性,然后显示?
  4. 我在这里明确表达了我的观点,所以如果我不清楚,请随时提出更多细节。

    提前致谢。     适当的在用户界面?

2 个答案:

答案 0 :(得分:8)

  1. 我会将状态设为自己的类和地址的导航属性。
  2. 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,但如果你使用它,那就像放
    2. 一样简单
      [UIHint("StatePicker")]
      public virtual USState State { get; set; }
      
      POCO或视图模型中的

      - 取决于您的视图使用的内容。然后在Views / Shared / EditorTemplates中添加一个局部视图StatePicker.cshtml,它会像

      那样
      @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,具体取决于需要。它更加灵活。

答案 1 :(得分:1)

  1. 是的,你可以创建一个扩展原始脚本的新DBCreation脚本,并创建一个与实体框架无关的状态表。

  2. 如果我是你,我会创建一个州实体。如果没有创建状态实体,最后你需要在代码中创建它,但填充这个实体将是一个问题,你需要使用sql(你可以将这些数据存储在xml中,这似乎比存储更好) SQL)。

  3. 如果您决定将表存储在数据库中并通过创建实体直接使用它,那么将其作为导航属性是一个更好的选择,因为您可以在延迟加载时直接使用它或通过包含它来预先加载。