Fluent nhibernate Fluent-在标识上与一个子项的关系,在复合键上与另一个子项的关系

Fluent nhibernate Fluent-在标识上与一个子项的关系,在复合键上与另一个子项的关系,fluent-nhibernate,composite-key,fluent-nhibernate-mapping,Fluent Nhibernate,Composite Key,Fluent Nhibernate Mapping,因此,我有一个Invoice对象,如下所示: public class Invoice { public virtual long InvoiceId { get; set; } public virtual string InvoiceNumber{ get; set; } public virtual Customer Customer { get; set; } public virtual Site Site { get; set; } pub

因此,我有一个
Invoice
对象,如下所示:

public class Invoice
{
    public virtual long InvoiceId { get; set; }

    public virtual string InvoiceNumber{ get; set; }
    public virtual Customer Customer { get; set; }
    public virtual Site Site { get; set; }

    public virtual IList<InvoiceLineItem> LineItems { get; set; }
    public virtual IList<InvoicePayment> Transactions { get; set; }
}
最后是发票付款

public class InvoicePayment
{
    public virtual long InvoicePaymentId { get; set; }

    public virtual Invoice Invoice{ get; set; }
}
问题是,在我的
InvoicePayment
的基础架构中,我有
InvoiceNumber
SiteId
(到
站点
对象)和
CustomerId
(到
客户
对象)

在InvoiceLineItem中,我将InvoiceId链接回
发票

因此,我的发票映射如下所示:

public sealed class InvoiceMap : ClassMap<Invoice>
{
    public InvoiceMap()
    {
        Table("InvoiceView");

        Id(x => x.InvoiceId).GeneratedBy.Identity();


        Map(x => x.InvoiceNumber);

        References<Site>(x => x.Site, "SiteId");
        References<Customer>(x => x.Customer, "CustomerId");

        HasMany<InvoiceLineItem>(x => x.LineItems)
            .Inverse();

        HasMany<InvoicePayment>(x => x.Transactions)
            .KeyColumns.Add("SiteId")
            .KeyColumns.Add("EPayCustomerId")
            .KeyColumns.Add("InvoiceNumber")
            .Inverse();
    }
}
公共密封类发票映射:类映射
{
公共发票地图()
{
表(“发票视图”);
Id(x=>x.InvoiceId).GeneratedBy.Identity();
映射(x=>x.InvoiceNumber);
参考文献(x=>x.Site,“SiteId”);
参考(x=>x.客户,“客户ID”);
HasMany(x=>x.LineItems)
.Inverse();
HasMany(x=>x.Transactions)
.KeyColumns.Add(“站点ID”)
.KeyColumns.Add(“EPayCustomerId”)
.KeyColumns.Add(“发票编号”)
.Inverse();
}
}
行项目映射

public class InvoiceLineItemMap : ClassMap<InvoiceLineItem>
{
    public InvoiceLineItemMap()
    {
        Table("InvoiceLineItems");

        Id(x => x.InvoiceLineItemId).GeneratedBy.Identity();

        References<FTNI.Core.Model.Invoice.Invoice>(x => x.Invoice, "InvoiceId");
    }
}
公共类InvoiceLineItemMap:ClassMap { 公共发票LineItemMap() { 表(“发票行项目”); Id(x=>x.InvoiceLineItemId).GeneratedBy.Identity(); 参考文件(x=>x.发票,“发票ID”); } } 最后是我的发票付款映射

public class InvoicePaymentMap : ClassMap<InvoicePayment>
{
    public InvoicePaymentMap()
    {
        Table("InvoicePayments");

        Id(x => x.InvoicePaymentId).GeneratedBy.Identity();

        CompositeId()
            .KeyProperty(x => x.Site, "SiteId")
            .KeyProperty(x => x.Customer, "CustomerId")
            .KeyProperty(x => x.InvoiceNumber);

        References<Site>(x => x.Site, "SiteId");
        References<EPayCustomer>(x => x.Customer, "CustomerId");

        References<FTNI.Core.Model.Invoice.Invoice>(x => x.Invoice)
            .Columns("SiteId", "CustomerId", "InvoiceNumber")
            .Nullable();

    }
}
公共类InvoicePaymentMap:ClassMap
{
公共发票支付地图()
{
表(“发票付款”);
Id(x=>x.InvoicePaymentId).GeneratedBy.Identity();
复合ID()
.KeyProperty(x=>x.Site,“SiteId”)
.KeyProperty(x=>x.Customer,“CustomerId”)
.KeyProperty(x=>x.InvoiceNumber);
参考文献(x=>x.Site,“SiteId”);
参考(x=>x.客户,“客户ID”);
参考(x=>x.Invoice)
.列(“站点ID”、“客户ID”、“发票编号”)
.Nullable();
}
}
所以,事实上,我得到了一个错误

外键(FKE9F746C567E71B3F:InvoiceLineItems[InvoiceId])必须与引用的主键(InvoiceView[SiteId,CustomerId,InvoiceNumber])具有相同的列数


如何调整映射,以便在复合id上加入发票付款和标识列上的行项目?

错误消息看起来有点奇怪。我希望
InvoiceMap
中的
CompositeId()…
会产生此错误

错误源于这样一个事实,即每个实体只能有一个Id,对CompositeId的调用将覆盖对Id的上一个调用,因此发票的Id是CompositeId,并且InvoiceLineItem中的一列不匹配

请尝试以下操作:

public class Invoice
{
    public virtual long InvoiceId { get; set; }

    public virtual InvoiceIdentity Identity { get; set; }

    public virtual IList<InvoiceLineItem> LineItems { get; set; }
    public virtual IList<InvoicePayment> Transactions { get; set; }

}

public class InvoiceIdentity
{
    public virtual string InvoiceNumber{ get; private set; }
    public virtual Customer Customer { get; private set; }
    public virtual Site Site { get; private set; }
    public Identity(string invoicenumber, Customer customer, Site site)
    {
        InvoiceNumber = invoicenumber;
        Customer = customer;
        Site = site;
    }
}

public sealed class InvoiceMap : ClassMap<Invoice>
{
    public InvoiceMap()
    {
        Table("InvoiceView");

        Id(x => x.InvoiceId).GeneratedBy.Identity();


        Component(x => x.Identity, c =>
        {
            c.Map(x => x.InvoiceNumber);

            c.References(x => x.Site, "SiteId");
            c.References(x => x.Customer, "CustomerId");
        });

        HasMany(x => x.LineItems)
            .Inverse();

        HasMany(x => x.Transactions)
            .PropertyRef(i => i.Identity)
            .KeyColumns.Add("SiteId", "EPayCustomerId", "InvoiceNumber")
            .Inverse();
    }
}

public class InvoicePaymentMap : ClassMap<InvoicePayment>
{
    public InvoicePaymentMap()
    {
        Table("InvoicePayments");

        Id(x => x.InvoicePaymentId).GeneratedBy.Identity();

        References(x => x.Invoice)
            .Columns("SiteId", "CustomerId", "InvoiceNumber")
            .PropertyRef(i => i.Identity)
            .Nullable();

    }
}
公共类发票
{
公共虚拟长发票ID{get;set;}
公共虚拟发票标识{get;set;}
公共虚拟IList行项目{get;set;}
公共虚拟IList事务{get;set;}
}
公共类发票标识
{
公共虚拟字符串InvoiceNumber{get;private set;}
公共虚拟客户客户{get;private set;}
公共虚拟站点站点{get;private set;}
公共标识(字符串发票编号、客户、站点)
{
发票编号=发票编号;
客户=客户;
地点=地点;
}
}
公共密封类InvoiceMap:ClassMap
{
公共发票地图()
{
表(“发票视图”);
Id(x=>x.InvoiceId).GeneratedBy.Identity();
组件(x=>x.Identity,c=>
{
c、 映射(x=>x.InvoiceNumber);
c、 参考文献(x=>x.Site,“SiteId”);
c、 参考(x=>x.客户,“客户ID”);
});
HasMany(x=>x.LineItems)
.Inverse();
HasMany(x=>x.Transactions)
.PropertyRef(i=>i.Identity)
.KeyColumns.Add(“站点ID”、“EPayCustomerId”、“发票编号”)
.Inverse();
}
}
公共类InvoicePaymentMap:ClassMap
{
公共发票支付地图()
{
表(“发票付款”);
Id(x=>x.InvoicePaymentId).GeneratedBy.Identity();
参考(x=>x.Invoice)
.列(“站点ID”、“客户ID”、“发票编号”)
.PropertyRef(i=>i.Identity)
.Nullable();
}
}
public class Invoice
{
    public virtual long InvoiceId { get; set; }

    public virtual InvoiceIdentity Identity { get; set; }

    public virtual IList<InvoiceLineItem> LineItems { get; set; }
    public virtual IList<InvoicePayment> Transactions { get; set; }

}

public class InvoiceIdentity
{
    public virtual string InvoiceNumber{ get; private set; }
    public virtual Customer Customer { get; private set; }
    public virtual Site Site { get; private set; }
    public Identity(string invoicenumber, Customer customer, Site site)
    {
        InvoiceNumber = invoicenumber;
        Customer = customer;
        Site = site;
    }
}

public sealed class InvoiceMap : ClassMap<Invoice>
{
    public InvoiceMap()
    {
        Table("InvoiceView");

        Id(x => x.InvoiceId).GeneratedBy.Identity();


        Component(x => x.Identity, c =>
        {
            c.Map(x => x.InvoiceNumber);

            c.References(x => x.Site, "SiteId");
            c.References(x => x.Customer, "CustomerId");
        });

        HasMany(x => x.LineItems)
            .Inverse();

        HasMany(x => x.Transactions)
            .PropertyRef(i => i.Identity)
            .KeyColumns.Add("SiteId", "EPayCustomerId", "InvoiceNumber")
            .Inverse();
    }
}

public class InvoicePaymentMap : ClassMap<InvoicePayment>
{
    public InvoicePaymentMap()
    {
        Table("InvoicePayments");

        Id(x => x.InvoicePaymentId).GeneratedBy.Identity();

        References(x => x.Invoice)
            .Columns("SiteId", "CustomerId", "InvoiceNumber")
            .PropertyRef(i => i.Identity)
            .Nullable();

    }
}