C# 排除数据库中的列并使用Nhibernate进行映射
我有以下情况 一个PurchaseOrder有许多行项目,一个发票有许多行项目。C# 排除数据库中的列并使用Nhibernate进行映射,c#,nhibernate,design-patterns,mapping,C#,Nhibernate,Design Patterns,Mapping,我有以下情况 一个PurchaseOrder有许多行项目,一个发票有许多行项目。 PurchaseOrder和Invoice完全不同。 如果特定的行项目有一个PuchaseOrder,则没有发票,反之亦然。 我需要坚持这些关系。在我的应用程序中,我使用的是NHibernate 我认为在数据库中,LineItems表可以有一个外键为PurchaseOrder的列和另一个外键为Invoice的列 最好的方法是什么?您的方法可以很好地工作,因为您的NHibernate映射可以区分它们使用的外键。这种
PurchaseOrder
和Invoice
完全不同。
如果特定的行项目
有一个PuchaseOrder
,则没有发票,反之亦然。
我需要坚持这些关系。在我的应用程序中,我使用的是NHibernate
我认为在数据库中,LineItems表可以有一个外键为PurchaseOrder的列和另一个外键为Invoice的列
最好的方法是什么?您的方法可以很好地工作,因为您的NHibernate映射可以区分它们使用的外键。这种方法唯一的缺点是故意创建一个始终包含空数据的列
另一种方法是使用一个外键列和一个鉴别器列。然而,虽然从关系模型的角度来看,这可能更简洁,但它会使NHibernate映射更加复杂。您的方法会很好地工作,因为您的NHibernate映射可以区分它们使用的外键。这种方法唯一的缺点是故意创建一个始终包含空数据的列
另一种方法是使用一个外键列和一个鉴别器列。但是,虽然从关系模型的角度来看,这可能更简洁,但它会使NHibernate映射更加复杂。您建议的解决方案是最好的,因为您只有两列相互排除。我的意思是,您的行项目属于PurchaseOrder或发票,并且您没有特定于PurchaseOrder行项目或发票行项目的其他数据 如果您想处理更接近对象类的数据库表和一种继承,那么就有EAV模型,但在您的案例中它似乎设计过度了
您建议的解决方案是最好的,因为只有两列相互排斥。我的意思是,您的行项目属于PurchaseOrder或发票,并且您没有特定于PurchaseOrder行项目或发票行项目的其他数据 如果您想处理更接近对象类的数据库表和一种继承,那么就有EAV模型,但在您的案例中它似乎设计过度了 型号 您可以将行项目映射为继承人 行项目继承权
public class LineItem
{
//common properties of LineItem
}
public class PurchaseLineItem : LineItem
{
public PurchaseOrder PurchaseOrder { get; set; }
}
public class InvoiceLineItem : LineItem
{
public Invoice Invoice { get; set; }
}
修改PurchaseOrder和Invoice以引用特定子项
采购订单:
public class PurchaseOrder
{
public IList<PurchaseLineItems> LineItems { get; set; }
}
公共类采购订单
{
公共IList行项目{get;set;}
}
发票:
public class Invoice
{
public IList<InvoiceLineItems> LineItems { get; set; }
}
公共类发票
{
公共IList行项目{get;set;}
}
数据库
在数据库方面,您可以考虑在不同的表中映射这两个项,但这将不必要地增加连接。您可以使用类型描述符为整个继承权采用单个表
行项目
的PurchaseOrder
或发票
哪个持有者可为空的混淆,并提高可读性李>
PurchaseOrder
作为PurchaseLineItem
的参数(类似地,Invoice
作为InvoiceLineItem
的构造函数参数)来改进设计,以确保这些实体在没有各自的持有者的情况下不会初始化public class LineItem
{
//common properties of LineItem
}
public class PurchaseLineItem : LineItem
{
public PurchaseOrder PurchaseOrder { get; set; }
}
public class InvoiceLineItem : LineItem
{
public Invoice Invoice { get; set; }
}
修改PurchaseOrder和Invoice以引用特定子项
采购订单:
public class PurchaseOrder
{
public IList<PurchaseLineItems> LineItems { get; set; }
}
公共类采购订单
{
公共IList行项目{get;set;}
}
发票:
public class Invoice
{
public IList<InvoiceLineItems> LineItems { get; set; }
}
公共类发票
{
公共IList行项目{get;set;}
}
数据库
在数据库方面,您可以考虑在不同的表中映射这两个项,但这将不必要地增加连接。您可以使用类型描述符为整个继承权采用单个表
行项目
的PurchaseOrder
或发票
哪个持有者可为空的混淆,并提高可读性李>
PurchaseOrder
作为PurchaseLineItem
的参数(类似地,Invoice
作为InvoiceLineItem
的构造函数参数)来改进设计,以确保这些实体在没有各自的持有者的情况下不会初始化