Fluent NHibernate - 映射表,它引用查找表中的ID

时间:2012-12-10 22:11:00

标签: c#-4.0 fluent-nhibernate asp.net-mvc-4 fluent-nhibernate-mapping

假设我有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对象?

1 个答案:

答案 0 :(得分:1)

如果没有映射Project_Vendors表,则不可能直接实现,因为NHibernate必须知道要引用的id的来源。你可以伪造它,但我会反对它。

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