0

だから、私は次の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にはInvoiceNumberSiteId(Siteオブジェクトへの) と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 の請求書支払いと ID 列の項目に結合するようにマッピングを調整するにはどうすればよいですか?

4

1 に答える 1

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

    }
}
于 2012-01-01T18:49:51.080 に答える