我正在用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的验证。相当常见的东西。所以,我有几个简单(我希望)的问题。
我在这里明确表达了我的观点,所以如果我不清楚,请随时提出更多细节。
提前致谢。 适当的在用户界面?
答案 0 :(得分:8)
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()
方法填充它。
[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 :(得分:1)
是的,你可以创建一个扩展原始脚本的新DBCreation脚本,并创建一个与实体框架无关的状态表。
如果我是你,我会创建一个州实体。如果没有创建状态实体,最后你需要在代码中创建它,但填充这个实体将是一个问题,你需要使用sql(你可以将这些数据存储在xml中,这似乎比存储更好) SQL)。
如果您决定将表存储在数据库中并通过创建实体直接使用它,那么将其作为导航属性是一个更好的选择,因为您可以在延迟加载时直接使用它或通过包含它来预先加载。