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

Ste*_*ard 12 c# poco code-first entity-framework-4.1

我正在用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; }
    }
Run Code Online (Sandbox Code Playgroud)

在state属性中,我想存储标准的美国双字母状态代码.出于验证目的,我希望在生成的Address表和相当标准的状态查找表之间建立标准的一对多外键关系.该表可能包含一个ID,两个字母的代码和一个包含完整州名的第三列.

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

  1. 我是否需要创建一个实体来表示State实体只是为了让EF创建表,或者我可以只将表创建过程包含在DBCreation策略中并在那里播种吗?
  2. 是否有意义创建该实体,只是作为"视图模型"用于我想要显示"状态选择器"的任何地方
  3. 我真的只想将两个字母的状态代码存储在地址实体中,但是这有意义还是让它成为状态实体的导航属性然后显示更有意义?

我在这里明确表达了我的观点,我有点挣扎,所以如果我不清楚,可以随意询问更多细节.

提前致谢.在UI中适当?

Ste*_*ory 8

  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; }
}
Run Code Online (Sandbox Code Playgroud)

使用代码首先EF将创建表,但您可以在Seed()方法中填充它.

  1. 您不一定需要使用视图模型,但使用共享视图在编辑表单中显示状态是有意义的.你没有提到MVC,但是如果你使用它,那就像推杆一样简单
[UIHint("StatePicker")]
public virtual USState State { get; set; }
Run Code Online (Sandbox Code Playgroud)

在您的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--")
Run Code Online (Sandbox Code Playgroud)

与...结合

@Html.EditorFor(m => m.State)
Run Code Online (Sandbox Code Playgroud)

在你看来.

  1. 导航属性.您的数据库将USState ID存储为外键,但您的应用程序可以使用addr.State.Code或addr.State.Text,具体取决于需要.它更加灵活.