Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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#_Sql Server 2005_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# nhibernate外键必须与引用的主键具有相同的列数

C# nhibernate外键必须与引用的主键具有相同的列数,c#,sql-server-2005,nhibernate,fluent-nhibernate,C#,Sql Server 2005,Nhibernate,Fluent Nhibernate,我将NHibernate 3.3与FluentNHibernate 1.3一起使用 我的数据库有两个表:InvoiceHeader和InvoiceDetail。标头有一个由两列组成的复合键。详细信息有一个单列主键。问题是,该细节不包含组合键的两个部分;它只有一部分。不存在外键约束 public class TInvoiceHeader { public virtual TInvoiceHeaderIdentifier Identifier { get; set; } publi

我将NHibernate 3.3与FluentNHibernate 1.3一起使用


我的数据库有两个表:InvoiceHeader和InvoiceDetail。标头有一个由两列组成的复合键。详细信息有一个单列主键。问题是,该细节不包含组合键的两个部分;它只有一部分。不存在外键约束

public class TInvoiceHeader 
{
    public virtual TInvoiceHeaderIdentifier Identifier { get; set; }
    public virtual long Dwinvoiceid { get; set; }
    public virtual int InvTimeID { get; set; }
    public virtual IList<TInvoiceDetail> Details { get; set; }
    ....
}

public class TInvoiceHeaderIdentifier
{
    public virtual long Dwinvoiceid { get; set; }
    public virtual int InvTimeID { get; set; }
    ....
}

public TInvoiceHeaderMap() 
{
    CompositeId<TInvoiceHeaderIdentifier>(x => x.Identifier)
        .KeyProperty(x => x.Dwinvoiceid, "DWInvoiceID")
        .KeyProperty(x => x.InvTimeID, "InvTimeID");
    HasMany<TInvoiceDetail>(x => x.Details).KeyColumn("DWInvoiceID");
    ....
}

public class TInvoiceDetail 
{
    public virtual TInvoiceHeader Header { get; set; }
    public virtual long Dwinvoicedetailid { get; set; }
    public virtual long Dwinvoiceid { get; set; }
    ....
}

public TInvoiceDetailMap() 
{
    Table("tInvoiceDetail");
    LazyLoad();
    Id(x => x.Dwinvoicedetailid).GeneratedBy.Identity().Column("DWInvoiceDetailId");
    References<TInvoiceHeader>(x => x.Dwinvoiceid);
    ....
}
公共类TInvoiceHeader
{
公共虚拟TInvoiceHeaderIdentifier标识符{get;set;}
公共虚拟长语音ID{get;set;}
公共虚拟int InvTimeID{get;set;}
公共虚拟IList详细信息{get;set;}
....
}
公共类TInvoiceHeaderIdentifier
{
公共虚拟长语音ID{get;set;}
公共虚拟int InvTimeID{get;set;}
....
}
公共图书馆
{
CompositeId(x=>x.Identifier)
.KeyProperty(x=>x.Dwinvoiceid,“Dwinvoiceid”)
.KeyProperty(x=>x.InvTimeID,“InvTimeID”);
HasMany(x=>x.Details);
....
}
公共类详细信息
{
公共虚拟TInvoiceHeader头{get;set;}
公共虚拟详细信息ID{get;set;}
公共虚拟长语音ID{get;set;}
....
}
公共TInvoiceDetailMap()
{
表(“详细信息”);
懒散的负荷();
Id(x=>x.Dwinvoicedetailid).GeneratedBy.Identity()列(“Dwinvoicedetailid”);
参考(x=>x.id);
....
}
我不知道如何进行此操作,因为详细信息行没有InvTimeID键。我得到:

NHibernate.Cfg.Configuration-外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数 NHibernate.FKUnmatchingColumnsException:外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数 位于NHibernate.Mapping.ForeignKey.AlignColumns(表referencedTable) 在NHibernate.Mapping.ForeignKey.AlignColumns()处 在NHibernate.Cfg.Configuration.SecondPassCompileForeKeys(表表,ISet done) NHibernate.Cfg.Configuration-外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数 NHibernate.FKUnmatchingColumnsException:外键(FKAD4039AB666D3F7:tInvoiceDetail[DWInvoiceID])必须与引用的主键(tInvoiceHeader[DWInvoiceID,InvTimeID])具有相同的列数 位于NHibernate.Mapping.ForeignKey.AlignColumns(表referencedTable) 在NHibernate.Mapping.ForeignKey.AlignColumns()处 在NHibernate.Cfg.Configuration.SecondPassCompileForeKeys(表表,ISet done)


这行吗?我的查询总是从标题到细节,而不是从标题到细节。我无法修改这些表。

升级nHibernate和Fluent nHibernate后,我遇到了这个问题。看起来它和列名混淆了

解决方案是手动命名我的列,问题就消失了

public void Override(AutoMapping<Record> mapping)
    {
        mapping.Id(x => x.Id).Column("RecordId");
        mapping.Map(x => x.Name).Not.Nullable();
        mapping.References(x => x.Parent).Not.Nullable().Column("ParentRecordId");
        mapping.References(x => x.Type).Not.Nullable().Column("TypeId");
    }
public void覆盖(自动映射)
{
mapping.Id(x=>x.Id).Column(“RecordId”);
mapping.Map(x=>x.Name).Not.Nullable();
mapping.References(x=>x.Parent).Not.Nullable().Column(“ParentRecordId”);
mapping.References(x=>x.Type).Not.Nullable().Column(“TypeId”);
}

如果两张发票可以具有相同的发票ID,这怎么可能起作用?不仅仅是NHibernate,还有所有的?头部有一个复合键。“详细信息”行有自己的键。两个头可以具有相同的VoiceID,但它们必须具有不同的InvTimeID。hvd是这么说的。当父表具有复合主键且子表缺少组成该键的一个或多个列时,无法在两个表之间建立声明性fk关系。重构InvoiceHeader表。@Amy但是如果两张发票都有发票ID 1,您如何确定哪些明细行属于第一张发票,哪些属于第二张发票?@Amy,您的InvoiceHeader表设计很古怪。