C#家庭类设计

时间:2015-07-01 15:33:12

标签: c# class-design

我正在为一个应用程序构建一个单独的单元(类)。我已经做了一些搜索并找到了整个家谱的解决方案,但是这个应用并不关心单个家庭单元之外的任何东西,它被定义为(父亲,母亲,孩子1,孩子+ n)

这个应用程序是关于孩子(他们可以根据年龄和技能水平做的活动),但需要参考父母。父母仅用于报告目的,并且必须存档驾驶执照和保险。

该应用程序正在使用C#& amp; EF Code First。没有数据库注释元素已添加到类中,因为这不是问题。

以下是我的课程。主要的商业规则规定每个兄弟姐妹都有他/她自己的记录,但他们需要连在一起,所以如果父母住在一起,只发送一封邮件(电子邮件或蜗牛)。如果父母离婚,则需要发送两封信(或电子邮件)。

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string Suffix { get; set; }
    public string Sex { get; set; }
    public DateTime DOB { get; set; }
}

public class Youth : Person
{
    public string CurrentGrade { get; set; }
    public Adult Mother { get; set; }
    public Adult Father { get; set; }
    public Adult ICE { get; set; }

    public virtual Adult Adult { get; set; }
}

public class Adult : Person
{
    public string DriversLicense { get; set; }
    public string StateIssued { get; set; }        
    public string AutoInsuranceCarrier { get; set; }
    public string PolicyNumer { get; set; }

    public string MaritalStatus { get; set; }

    //foreign key
    public int VehicleId { get; set; }
    public virtual Vehicle Vehicle { get; set; }
}

public class Address
{
    public int AddressId { get; set; }
    public int PersonId { get; set; }

    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }

    public virtual Person Person { get; set; }
}

我陷入困境的逻辑模式是兄弟姐妹将拥有相同的AddressId。当我申请离婚的父母,每个孩子都有一个孩子在他们的地址时失败了。在邮件发送时,它会起作用,因为它们位于不同的地址。它不像是最好的设计。如果这是由UI处理的,那么它会起作用。

我的下一个想法是创建一个Family类并将每个家庭成员添加到它。在这种情况下,用户必须选择哪些人住在哪个地址。

public class Family
{
    public int FamilyId { get; set; }
    public int AddressId { get; set; }
    public List<Person> Person;
}

这似乎也不是最好的解决方案。我觉得有更好的设计。我自己找不到它。

我还没有看到其中一种方法存在任何陷阱吗? 有人能指出我更好的方向吗?并解释为什么这个方向更好?

提前感谢您的所有见解!

4 个答案:

答案 0 :(得分:1)

“父亲”,“青年”,“兄弟”等......不是人的属性,而是人与人之间关系的属性。一个人可以是“父亲”,“兄弟”和“叔叔”。

更好的设计是这样的(我不知道你的所有要求):

public class Person {
    public Name{get;set;}
    // etc...
    public List<Relationship> Relationships{get;set;}
}

public class Relationship {
    public Person P1{get;set;}
    public Person P2{get;set;}
    public RelationshipKind Kind{get;set;}
}

public class RelationshipKind {
   // for example: Father
   public Name1 {get;set;}
   // for example: Child
   public Name2 {get;set;}
}

答案 1 :(得分:1)

通常,您希望保持模型流畅,就像您想象的那样。

例如,我没有包含Person的Address类。我会有一个Address类,只包含有关Address的基本数据。亲自,我会有一个地址。这符合“人居住在这个地址”,并可能会解决你的生活问题。这是“车辆”

的设置类型

答案 2 :(得分:0)

如果不详细了解整个设计,我将只关注地址问题。

我建议您将地址类定义为没有导航属性的方式:

public class Address
{
    public int AddressId { get; set; }    

    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }

}

然后我会将您的Adult(或甚至Person)课程链接到地址,如下所示:

public class Adult : Person
{
    public string DriversLicense { get; set; }
    public string StateIssued { get; set; }        
    public string AutoInsuranceCarrier { get; set; }
    public string PolicyNumer { get; set; }

    public string MaritalStatus { get; set; }

    //foreign key
    public int VehicleId { get; set; }
    public virtual Vehicle Vehicle { get; set; }

    public int AddressId {get; set;}
    public virtual Address Address { get; set; }
}

通过这种方法,如果父母没有离婚,他们可以共享同一个地址实例。如果他们离婚,您的申请必须为其中一个父母设置不同的地址。如果您需要找到居住在同一地址的人,您可以这样做:

_dbContext.Persons.Where(p => p.AddressId = addressId) ...

答案 3 :(得分:0)

如果你有一个状态表,那么你可以在很多地方使用它:DriversLicenseState,AddressState,InsuranceState等。如果这不是一个空白字符串,那么你不必验证用户输入,只能在应用程序上放下一个下拉列表。

字符串当前等级。如果您输入孩子进入一年级的年份,那么您不必每年手动更新;它可以计算 - 尽管你还必须为NumberOfYearsHeldBack包含一个int。但是,在很长一段时间内更新那个int的工作要少,而不是每年更新每个学生。

个人偏好:我喜欢'NameLast'和'NameFirst'而不是'FirstName'&amp; 'LastName'只是因为它意味着这些属性将在所有IDE下拉菜单中按字母顺序聚集在一起,就像AddressID,Address1和Address2

一样

您可能会考虑将“母亲”变成一个可以自欺欺人的“妈妈”吗?与“父亲”和“父亲”一样吗?有些孩子根本没有父母。如果你想在政治上正确,你可以考虑'Parent1?'和'Parent2'并在关系上选择母亲,父亲,监护人,因为有些孩子有2个妈妈或2个爸爸,或者他们的哥哥是他们的法定监护人。

在您的地址类中,为什么在您拥有PersonID属性时会有人员属性?那么为什么地址根本就有personID?这只需要是单向的。一个人有地址,但地址没有人。这样你就可以让5个人拥有相同的地址。如果你试图保持两个同步,它会被搞砸,更不用说你必须有一个List&lt;&gt;地址内的personID。由于地址是一种类型,因此请为每个人添加另一个,以便您拥有AddressPhysical和AddressMailing。现在你可以有4个孩子,每个孩子都有不同的地方,但是他们都会在奶奶的P.O.Box上收到邮件。

我不会在孩子身上添加第三个成年人作为他们的ICE。相反,我会创建一个List&lt;&gt;成年人(它只是真正的ID in列表)这样你就可以在紧急情况下继续工作,直到找到某人为止。