Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排除数据库中的列并使用Nhibernate进行映射_C#_Nhibernate_Design Patterns_Mapping - Fatal编程技术网

C# 排除数据库中的列并使用Nhibernate进行映射

C# 排除数据库中的列并使用Nhibernate进行映射,c#,nhibernate,design-patterns,mapping,C#,Nhibernate,Design Patterns,Mapping,我有以下情况 一个PurchaseOrder有许多行项目,一个发票有许多行项目。 PurchaseOrder和Invoice完全不同。 如果特定的行项目有一个PuchaseOrder,则没有发票,反之亦然。 我需要坚持这些关系。在我的应用程序中,我使用的是NHibernate 我认为在数据库中,LineItems表可以有一个外键为PurchaseOrder的列和另一个外键为Invoice的列 最好的方法是什么?您的方法可以很好地工作,因为您的NHibernate映射可以区分它们使用的外键。这种

我有以下情况

一个PurchaseOrder有许多行项目,一个发票有许多行项目。
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
    的构造函数参数)来改进设计,以确保这些实体在没有各自的持有者的情况下不会初始化