1

我正在尝试“清理”设计不佳的数据库结构(至少在我的 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……它应该是一对一的映射。我怎样才能获得那里的“哪里”条款(IE WHERE Address.memberID = Members.customerID)来区分计费和运输?另外,top 1呢?我知道我也许可以使用Join,但我没有看到一个流畅的函数来添加 where 子句。

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

谢谢

4

1 回答 1

1

你不想要 HasOne(),虽然听起来是对的。HasOne() 表示表共享主键。请改用 References()。

于 2010-12-02T05:03:46.617 回答