gpt4 book ai didi

c# - 如何设计一个包含查询表中的属性的类?

转载 作者:太空狗 更新时间:2023-10-29 21:46:18 26 4
gpt4 key购买 nike

一些背景:这符合我的新兴愿望,即使用以下方法构建多层Web应用程序:

  • C#ASP.NET Web表单
  • C#POCO业务对象
  • 某种DAL ... SQL(如果我能弄清楚的话,也许是EF4)

  • 例如,我真的不希望这样的响应使我的表示层直接与EF实体对话。

    我已经使用C#ASP.NET和SQL进行自己的Web开发已有10年了,但是就正式的OOAD而言,我仍然是一个新手。我最近一直热衷于追求这项技能,但是我仍然很陌生,有些事情我还无法完全解决。我希望有人能以一种顿悟的方式来解释它:

    假设我创建了一个以某种方式管理 人员的Web应用程序,并且我的Person对象必须具有诸如FirstName,LastName,HairColor,EyeColor,Eariousity,StateOrProvince等属性。我正在使用SQL Server进行持久化。 。因此,常识将指示People表中的各个字段均为外键:
    FirstName varchar(50)
    LastName varchar(50)
    HairColor tinyint
    EyeColor tinyint
    Ethnicity tinyint
    StateOrProvince tinyint

    显然,这意味着我为每个字段(例如,HairColors表,EyeColors表,种族表等)都有对应的查找表,并且每个查找表都有一个ID和一个名称。当然,每当我要显示有关人员的任何有用信息时,这些查询表中的“名称”字段都将与“人员”数据结合在一起。

    该网站的一些关键功能是:

    1.)枚举Gridview中的人(名字,姓氏,HairColor,EyeColor,种族,州或省)

    2.)在只读页面上显示个人的详细信息(名字,姓氏,头发颜色,眼睛颜色,种族,州或省)

    3.)允许用户在更新页面(名字,姓氏,头发颜色,眼睛颜色,种族,州或省)上更新个人数据。

    案例1
    如果我在gridview中枚举Person对象的集合...每个Person实例将需要显示其HairColor,EyeColor,种族,StateOrProvince属性 作为字符串才有意义(即,SQL查找表中的Name字段,而不是其ID)。显然,我的SQL sproc将具有一些JOIN,以便为我提供在每个Person实例中填充这些文本属性所需的适当字符串数据。

    案例#2
    再次,我的存储程序将具有一个JOIN来将人类可读的属性名称 作为字符串带回来,并且我将使用诸如myPerson.HairColor,myPerson.EyeColor等的内容将它们显示在只读Label控件中。

    案例#3
    在这里,我将显示一个页面,其中包含每个属性的下拉列表(即value = HairColorId,Text = HairColorName)。我的直接直觉是 使用每个属性的ID (类似于myPerson.HairColorId)来遍历DDL项并选择一个值,该值代表People表当前为该Person持有的头发颜色。如果用户在任何属性DDL中选择了不同的内容,则需要将适当的SelectedId值传递给UPDATE程序,并为此特定Person修改People表中的值。

    因此,这引出了一个最终的问题:

    如何最好地设计一个Person对象,使其同时包含HairColor,EyeColor,Eariousness,StateOrProvince的ID和名称,因此当 显示信息时,我可以随后使用 名称,但是 标识ID 用于初始化更新DDL控制...并最终处理 更新吗?

    正如我对此的反射(reflection)...我得出的结论是,我需要创建代表HairColor,EyeColor,Eariousity,StateOrProvince属性的类。

    然后是我的Person类,而不是像这样的东西:
    public class Person
    {
    string FirstName { get; set; }
    string LastName { get; set; }

    int HairColorId { get; set; }
    string HairColorName { get; set; }

    int EyeColorId { get; set; }
    string EyeColorName { get; set; }

    int StateOrProvinceId { get; set; }
    string StateOrProvinceName { get; set; }
    string StateOrProvinceCode { get; set; }
    }

    而是将其扩展为如下所示:
    public class HairColor
    {
    int Id { get; set; }
    string Name { get; set; }
    }

    public class EyeColor
    {
    int Id { get; set; }
    string Name { get; set; }
    }

    public class StateOrProvince
    {
    int Id { get; set; }
    string Name { get; set; }
    string Code { get; set; }
    }

    public class Person
    {
    HairColor HairColor { get; set; }
    EyeColor EyeColor { get; set; }
    StateOrProvince StateOrProvince { get; set; }

    public Person()
    {
    // how do I initialize a Person from a SQL data row?

    }
    }

    但是,如果我的Person类确实如上所示……从我从SQL查询返回的给定数据行中,无论如何(无论是单独还是在集合中),如何最好地对其进行初始化?我似乎记得我不应该在构造函数中进行更新(例如this.HairColor = new HairColor(dr [“HairColorId”),dr [“HairColorName”];)...所以我想知道拨电至
    public static IEnumerable<Person> GetPeople()
    {
    ...
    }

    在我的BLL中,是否可能在将每个用户的数据添加到集合之前将其填满?

    真的希望有人能在这里给我一个“哈哈”的时刻...

    最佳答案

    我认为您有正确的方法,为那些支持实体创建类(尽管我将StateOrProvince放在单独的Address实体中,也许所有这些特性都放在单独的PersonTraits实体中)。

    有很多方法可以解决这个问题。如果没有ORM,请查看Data Mappers(也可以查看Dependent Mapping),它可以用于从数据库查询映射到Person实例。这是映射器代码的概述:

    var row = ... // query database
    var person = new Person(row["FirstName"], row["LastName"]);
    person.EyeColor = new EyeColor(row["EyeColorID"], row["EyeColorName"]);
    ...

    (您还可以使用某种单独的 Object Builder。)

    每当您更新一个人时,您也将使用相关实体的ID更新所有支持信息。

    更新:像EF4这样的ORM非常强大,可以帮助您完成许多重复性任务(例如我所描述的映射)。重要的是保持体系结构的灵活性,并将持久性作为一个可交换层。查看 here以获取一些指导。另外,我发现《域驱动设计》一书对于理解这种分离以及如何为实体建模非常重要。

    关于c# - 如何设计一个包含查询表中的属性的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755772/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com