EF代码优先中查找表的最佳实践

本文关键字:最佳 查找 代码 EF | 更新日期: 2023-09-27 18:30:09

我正在用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. 我是否需要创建一个实体来代表国家实体让EF创建表格,或者我可以只包括表格创建在DBCreation策略中进行处理并在那里播种
  2. 创建那个实体,仅仅用作"视图",有意义吗模型",用于我要显示"状态选择器"的任何位置
  3. 我真的只想把两个字母的州代码存储在地址中实体,但这有意义吗使其成为状态实体的导航属性,然后显示

我在这里有点难以表达我的观点,所以如果我不清楚,请随意询问更多细节。

提前谢谢。是否在UI中适当?

EF代码优先中查找表的最佳实践

  1. 我会使state成为它自己的类和Address的导航属性
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. 你不一定需要使用视图模型,但使用共享视图以编辑形式显示状态是有意义的
[UIHint("StatePicker")]
public virtual USState State { get; set; }

在您的POCO或视图模型中-取决于您的视图使用的内容。然后在Views/Shared/EditorTemplates中,添加一个部分视图StatePicker.chtml,它看起来像

@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。州。代码或地址。状态。文本,根据需要而定。它更灵活
  1. 是的,您可以创建一个扩展原始脚本的新DBCreation脚本,并创建一个与实体框架无关的状态表。

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

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