13

我正在用 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 属性中,我想存储标准的美国两字母州代码。出于验证目的,我希望在结果地址表和相当标准的状态查找表之间建立标准的一对多外键关系。该表可能包含一个 ID、两个字母的代码和包含完整州名的第三列。

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

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

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

提前致谢。在 UI 中合适吗?

4

2 回答 2

9
  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<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。它更加灵活。
于 2012-04-06T15:13:16.227 回答
1
  1. Yes you can just create a new DBCreation script extending the original script and create a state table which has no relation with the Entity Framework.

  2. If I were you I would create the state entity. If state entity is not created, in the end you need to create it in the code, but populating this entity will be a problem, you will need to use sql (you may store this data in xml which seems a better option than storing in sql).

  3. If you decide to store the table in the database and directly use it by creating an entity, making it a navigation property is a better option since you may use it directly while lazy loading or eager loading by including it.

于 2012-04-06T14:59:38.380 回答