我正在为一个应用程序构建一个单独的单元(类)。我已经做了一些搜索并找到了整个家谱的解决方案,但是这个应用并不关心单个家庭单元之外的任何东西,它被定义为(父亲,母亲,孩子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;
}
这似乎也不是最好的解决方案。我觉得有更好的设计。我自己找不到它。
我还没有看到其中一种方法存在任何陷阱吗? 有人能指出我更好的方向吗?并解释为什么这个方向更好?
提前感谢您的所有见解!
答案 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列表)这样你就可以在紧急情况下继续工作,直到找到某人为止。