c# - How can i implement this design, with nhibernate. -
i have class expense, beneficiaries, can desk or user, expense has 1 or more beneficiaries , can 1 type, desk or user different repartition.
[datacontract] [knowntype(typeof(user))] [knowntype(typeof(desk))] public abstract class beneficiare { [datamember] public virtual int id { get; set; } [datamember] public virtual string fullname { get; set; } } [datacontract] public class desk : beneficiare { [datamember] public virtual int nbemployee { get; set; } //other properties , method } [datacontract] public class user : beneficiare { [datamember] public virtual string surname { get; set; } [datamember] public virtual string lastname { get; set; } //other properties , method } [datacontract] public class expenserepartition { [datamember] public virtual int id { get; set; } [datamember] public virtual beneficiare beneficiare { get; set; } [datamember] public virtual expense expense { get; set; } [datamember] public virtual decimal percentage { get; set; } } [datacontract(isreference = true)] public class expense { [datamember] public virtual int id { get; set; } [datamember] public virtual datetime cobdate { get; set; } [datamember] public virtual amount amount { get; set; } [datamember] public virtual ilist<expenserepartition> repartition { get; set; } }
so basically,with nhibernate, can utilize desk , user " table per class hierarchy" or "table per concrete subclass". don't utilize table per class hierrachy have lot of different property i'll end table in database lot of column , lot of them null. don't create inherite user , desk same object, appart having name totally unrelated. instead thinking
[datacontract] public class desk { [datamember] public virtual int id { get; set; } [datamember] public virtual string name { get; set; } [datamember] public virtual int nbemployee { get; set; } //other properties , method } [datacontract] public class user { [datamember] public virtual int id { get; set; } [datamember] public virtual string fullname { get; set; } [datamember] public virtual string surname { get; set; } [datamember] public virtual string lastname { get; set; } //other properties , method } [datacontract] [knowntype(typeof(expenserepartitionuser))] [knowntype(typeof(expenserepartitiondesk))] public abstract class expenserepartition { [datamember] public virtual int id { get; set; } [datamember] public virtual expense expense { get; set; } [datamember] public abstract string beneficiarename { get; } [datamember] public virtual decimal percentage { get; set; } } [datacontract] public class expenserepartitiondesk :expenserepartition { [datamember] public virtual desk beneficiare { get; set; } public override string beneficiarename { { homecoming beneficiare.name; } } } [datacontract] public class expenserepartitionuser : expenserepartition { [datamember] public virtual user beneficiare { get; set; } public override string beneficiarename { { homecoming beneficiare.fullname; } } } [datacontract(isreference = true)] public class expense { [datamember] public virtual int id { get; set; } [datamember] public virtual datetime cobdate { get; set; } [datamember] public virtual amount amount { get; set; } [datamember] public virtual ilist<expenserepartition> repartition { get; set; } }
inheritance on expanserepartition class instead of desk , user, knowing percentage calculation can vary, illustration if it's user it's user fill if it's desk depends on number of desk's employee/ total number of employee in expense's repartition. in case nhibernate can utilize table per hierarchy expanse repartition discriminator-value in 1 column or table per concrete class 1 column id of user or desk. best solution/design ? or maybe there one.
from our give-and-take on nhibernate mailing list
http://notherdev.blogspot.com/2012/01/mapping-by-code-inheritance.html
the 3rd alternative utilize table per subclass unioned subclasses. time there no separate table base of operations class, mutual columns specified in each table subclass separately , subclass tables share same key generator. mapping union subclasses mapping-by-code simple - need map class inheriting unionsubclassmapping - no additional requirements or options.
c# nhibernate design
No comments:
Post a Comment