【问题标题】:Best Practices for Lookup Tables in EF Code-FirstEF Code-First 中查找表的最佳实践
【发布时间】:2012-04-20 03:55:42
【问题描述】:

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

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

提前致谢。 在 UI 中是否合适?

【问题讨论】:

  • 3- 我个人使用实体只是因为它可以避免用户的印刷错误。如果您在许多实体中使用它(现在或以后),我也会确保一致性。但是,如果您的应用程序相当小或者您不需要太多验证,那么我看不到太多将这两个字母直接放在您的地址实体中的反指示。

标签: c# entity-framework-4.1 poco code-first


【解决方案1】:
  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。它更加灵活。

【讨论】:

  • 如果您使用 ViewModels 怎么办?我已经尝试了上面的方法,它似乎不起作用?我将如何在对象上的 Id 和查找实体之间进行映射?
  • @Burt 我上面的例子并不完整,但该技术适用于使用视图模型或直接使用模型。首先使用 EF 代码,框架会为您进行映射。可以找到我对 EF 和 MVC 的好(以及最近的)介绍 here
【解决方案2】:
  1. 是的,您可以创建一个新的 DBCreation 脚本来扩展原始脚本并创建一个与实体框架无关的状态表。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2014-01-17
    • 2016-06-17
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多