0

次のように定義された 4 つのテーブルがあるとします。

プロジェクト: [ Project_Id, Project_Name ]

ベンダー: [ Vendor_Id, Vendor_Name ]

Project_Vendors : [ Project_Vendor_Id, Vendor_Id, Project_Id ]

支払い: [ Payment_Id, Project_Vendor_Id, Payment_Amount ]

関係は次のようになります。

  • プロジェクトには多くのベンダーを関連付けることができます
  • ベンダーは多くのプロジェクトに所属できます
  • プロジェクトの多くのベンダーに対して多くの支払いを行うことができます(したがって、支払いを一意にするのはプロジェクトとベンダーです)

以下の ProjectVendors ルックアップ テーブルを使用して、Project オブジェクトと Vendor オブジェクト、およびそれらの関係を簡単にマップできます。

public class ProjectMapping : ClassMap<Project>
{
    public ProjectMapping()
    {
         Table("Projects");
         Id(x => x.Id).Column("Project_Id").GeneratedBy.TriggerIdentity();
         HasManyToMany(x => x.Vendors).Table("Project_Vendors")
             .ParentKeyColumn("Project_Id")
             .ChildKeyColumn("Vendor_Id")
             .Cascade.AllDeleteOrphan();
    }
}

私の質問は、私のクラスが次のように定義されているかどうかです。

public class Payment
{
    public virtual int? Id { get; set; }
    public virtual Project Project { get; set; }
    public virtual Vendor Vendor { get; set; }
    public virtual double Amount { get; set; }
}

public class Project
{
    public virtual int? Id { get; set; }
    public virtual string Name { get; set; }
    public virtual List<Vendor> Vendors { get; set; }
    public virtual List<Payment> VendorPayments { get; set; }
}

ルックアップ テーブル Project_Vendors を使用して Project オブジェクトと Payment オブジェクトをマップするにはどうすればよいですか?

4

1 に答える 1

1

NHibernate は参照する ID がどこから来たのかを知る必要があるため、Project_Vendors テーブルをマッピングしないと直接的には不可能です。あなたはそれを偽造することができるかもしれませんが、私はそれに対してアドバイスします.

class ProjectVendorPair
{
    public virtual int Id { get; set; } 
    public virtual Project Project { get; set; }
    public virtual Vendor Vendor { get; set; }
}

// in PaymentMap
References(x => x.Owner, "Project_Vendor_Id");

または、データベース構造を変更します。

  • 列 Project_Vendor_Id を取り除く
  • 支払いテーブルに列 Project_Id と Vendor_Id があります
于 2012-12-11T19:31:26.023 に答える