EF 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; } } 

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

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

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

我在这里明确表达了我的观点,所以如果我不清楚,请随时提出更多细节。

提前致谢。 适当的UI?

  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或视图模型中 – 取决于您的视图使用的内容。 然后在Views / Shared / EditorTemplates中添加一个局部视图StatePicker.cshtml,它会像这样

 @inherits System.Web.Mvc.WebViewPage @Html.DropDownListFor(m => m, new SelectList((IEnumerable)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. 是的,您可以创建一个新的DBCreation脚本来扩展原始脚本并创建一个与entity framework无关的状态表。

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

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