流利 - 与一个孩子的身份关系,与其他孩子在复合关键词上的关系

时间:2011-12-22 16:45:49

标签: 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; }

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

然后,我有一个像这样的发票行项目

public class InvoiceLineItem
{
    public virtual long InvoiceLineItemId { get; set; }

    public virtual Invoice Invoice{ get; set; }
}

最后,发票付款

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

    public virtual Invoice Invoice{ get; set; }
}

问题在于,在InvoicePayment的基础架构中,我有InvoiceNumberSiteIdSite对象)和CustomerId(到Customer对象)。

在InvoiceLineItem中,我将InvoiceId链接回Invoice

所以,我对Invoice的映射看起来像这样:

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();
    }
}

订单项映射

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");
    }
}

最后是我的发票付款映射

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();

    }
}

所以,实际上,我收到了一个错误

  

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

如何调整我的映射,以便加入复合ID和标识列上的订单项的发票付款?

1 个答案:

答案 0 :(得分:1)

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

错误源于这样一个事实,即每个实体只能有1个Id,而对CompositeId的调用会覆盖之前对Id的调用,因此Invoice的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();

    }
}
相关问题