C# 在EF代码中查找表的最佳实践

C# 在EF代码中查找表的最佳实践,c#,entity-framework-4.1,poco,code-first,C#,Entity Framework 4.1,Poco,Code First,我正在用EF做我的第一个项目,我计划采用代码优先的模式。我试图找到一些关于处理相当经典的“查找表”场景的指导 我正在处理一种非常规范的情况,在这种情况下,我将持久化地址数据。所以,我有一个简单的地址DTO public class Address { public int Id { get; set; } public virtual string StreetAddress1 { get; set; } public virtual st

我正在用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、两个字母的代码和第三列以包含完整的州名称

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

  • 我需要创建一个实体来代表国家实体吗 让EF创建表,还是只包含表创建 在DBCreation策略中处理并在那里播种
  • 创建那个实体,仅仅作为“视图”使用,有意义吗 “模型”,用于显示“状态选择器”的任何位置
  • 我真的只想在地址中存储两个字母的州代码 实体,但这是有意义的还是仅仅 将其作为状态实体的导航属性,然后显示
  • 我在这里有点难以表达我的观点,所以如果我不清楚,请随意询问更多细节

    提前谢谢。 在用户界面中是否适当

  • 是的,您可以创建一个新的DBCreation脚本来扩展原始脚本,并创建一个与实体框架没有关系的状态表

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

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

  • 我会将state设置为它自己的类和地址的导航属性
  • 使用代码优先,EF将创建表,但您可以在
    Seed()
    方法中填充它

  • 您不一定需要使用视图模型,但使用共享视图在编辑表单中显示状态是有意义的。你没有提到MVC,但是如果你使用它,那么它就很简单了
  • 在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--")
    
    在你看来

  • 导航属性。您的db将USState id存储为外键,但您的应用程序可以根据需要使用addr.State.Code或addr.State.Text。它更灵活

  • 3-我个人使用一个实体来做这件事,只是因为它可以避免用户的排版错误。如果在许多实体(现在或以后)中使用,我还可以确保一致性。但是,如果您的应用程序相当小,或者不需要太多验证,我看不出有多少相反的指示可以直接将这两个字母放在您的地址实体中。如果您使用的是ViewModels呢?我试过上面的方法,但似乎不起作用?如何在Id和对象上的查找实体之间映射?@Burt我上面的示例并不完整,但该技术适用于使用viewmodel或直接使用模型。首先使用EF代码,框架为您进行映射。我对EF和MVC有很好的(以及最近的)介绍
    [UIHint("StatePicker")]
    public virtual USState State { get; set; }
    
    @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)