流畅的NHibernate映射(有条件的一对一)

时间:2010-12-01 18:59:15

标签: nhibernate orm fluent-nhibernate nhibernate-mapping one-to-one

我正在尝试“清理”设计不良的数据库结构(至少在我的ORM中)。

表格结构如下:

Table: Members
memberID (int PK)
username (varchar)

Table: Addresses
addressID (int PK)
memberID (int, not set as a FK - awesome)
firstName (varchar)
lastName (varchar)
addressLine1 (varchar)
isBillingAddress (bit)

所以我创建了2个类(实体),一个用于客户,一个用于地址。

public class Customer
{
    public virtual int CustomerID { get; set; }
    public virtual string FirstName
    {
        get { return BillingAddress.FirstName; }
        set { BillingAddress.FirstName = value; }
    }
    public virtual string LastName
    {
        get { return BillingAddress.LastName; }
        set { BillingAddress.LastName = value; }
    }
    public virtual Address BillingAddress { get; set; }
    public virtual Address ShippingAddress { get; set; }
}

public class Address
{
    public virtual Customer Customer { get; set; }
    public virtual int AddressID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string AddressLine1 { get; set; }
    public virtual string AddressLine2 { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual string PostalCode { get; set; }
}

检索客户帐单邮寄地址的查询将是:

SELECT TOP 1 *
FROM dbo.Address
WHERE isBilling = 1
AND memberID = @memberID

每位客户应该只有1个结算和送货地址。 到目前为止,我的流畅类图如下所示:

public class CustomerMapping : ClassMap<Customer>
{
    public CustomerMapping()
    {
        Table("Members");

        Id(m => m.CustomerID).Column("memberID");
        Map(m => m.BillingAddress);

        HasOne(x => x.BillingAddress).PropertyRef("memberID");
        HasOne(x => x.ShippingAddress).PropertyRef("memberID");
    }
}

我不确定我是否应该使用HasOne ......它应该是一对一的映射。如何在其中获取“where”条款(I.E. WHERE Address.memberID = Members.customerID)以区分结算和运输?还有,前1名怎么样?我知道我可以使用Join,但我没有看到一个流畅的函数来添加where子句。

遗憾的是,修改数据库结构不是一种选择。

由于

1 个答案:

答案 0 :(得分:1)

你不需要HasOne(),虽然听起来不错。 HasOne()表示表共享主键。改为使用References()。