我们正在使用实体框架的每层次表继承技术。我将把本页的示例类作为基本类:表每层次继承-模型。请不要使用已设置的类名和属性。我不想暴露任何重要的东西。这个问题是关于结构的。
public class Contract
{
public int ContractId { get; set; }
public DateTime StartDate { get; set; }
public int Months { get; set;}
public decimal Charge { get; set; }
}
public class MobileContract : Contract
{
public string MobileNumber { get; set; }
}
public class TvContract : Contract
{
public PackageType PackageType { get; set; }
}
public class BroadBandContract : Contract
{
public int DownloadSpeed { get; set; }
}
public enum PackageType
{
S, M, L, XL
}
现在,在我们的例子中,我们有一个契约,它可以是一个TvContract
和一个BroadBandContract
,例如一个MultiContract
。我们不知道如何处理这个问题,因为我们不能继承两个类。如果我们从中查询DbSet<TvContract>
或DbSet<BroadBandContract>
,我们还想获得MultiContract
s。
有人知道如何处理这种情况吗?
我看到我们当前的类结构是继承的。而对我来说,它看起来像是构图。一个合同可能包含不同的分包合同,一旦合同到期,分包合同也会到期。然而,分包合同是不同类型的,这是你可以利用的优势。您可能还会看到这样的需求:有人会添加或删除他们拥有的包,因此契约类型并不是真正静态的。我会设计来处理这个问题。我还希望在SubContract
上单独设置结束日期或Months
,允许SubContract
对象的可变开始和结束日期。
我会像这样重新设计类,然后只可能使用基于SubContract的过滤器查询Contract。
public class Contract
{
public int ContractId
{
get;
set;
}
public DateTime StartDate
{
get;
set;
}
public int Months
{
get;
set;
}
public decimal Charge
{
get;
set;
}
public bool IsMultiContract
{
get
{
return SubContracts.GroupBy(x => x.ContractType).Count() > 0;
}
}
/// <summary>
/// Optional unique check for subcontract types may be added
/// </summary>
public List<SubContract> SubContracts
{
get;
set;
}
}
public enum ContractType
{
Broadband,
Mobile,
TV
}
public class SubContract
{
public ContractType ContractType
{
get;
set;
}
}
public class MobileContract : SubContract
{
public string MobileNumber
{
get;
set;
}
}
public class TvContract : SubContract
{
public PackageType PackageType
{
get;
set;
}
}
public class BroadBandContract : SubContract
{
public int DownloadSpeed
{
get;
set;
}
}
public enum PackageType
{
S,
M,
L,
XL
}