Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fluent NHibernate映射(带条件的一对一)_Nhibernate_Orm_Fluent Nhibernate_Nhibernate Mapping_One To One - Fatal编程技术网

Fluent NHibernate映射(带条件的一对一)

Fluent NHibernate映射(带条件的一对一),nhibernate,orm,fluent-nhibernate,nhibernate-mapping,one-to-one,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

我正试图“清理”一个设计糟糕的数据库结构(至少在我的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)
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");
    }
}
所以我创建了两个类(实体),一个用于客户,一个用于地址

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
每个客户应该只有一个帐单和发货地址。 到目前为止,我的fluent类地图如下所示:

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)
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");
    }
}
公共类CustomerMapping:ClassMap
{
公共CustomerMapping()
{
表(“成员”);
Id(m=>m.CustomerID).Column(“memberID”);
Map(m=>m.BillingAddress);
HasOne(x=>x.BillingAddress).PropertyRef(“memberID”);
HasOne(x=>x.ShippingAddress).PropertyRef(“memberID”);
}
}
我不确定我是否应该使用HasOne。。。它应该是一对一的映射。如何获取其中的“where”子句(即
where Address.memberID=Members.customerID
)来区分账单和发货?还有,排名第一的呢?我知道我可以使用
Join
,但是我没有看到一个fluent函数来添加where子句

不幸的是,修改数据库结构不是一个选项


谢谢

你不想要HasOne(),尽管听起来不错。HasOne()表示表共享主键。使用References()。

您不需要HasOne(),尽管它听起来不错。HasOne()表示表共享主键。请改用References()。

谢谢,我将改用它。。。然而,如果不能有条件地引用地址,这对我没有好处。你说的“有条件地引用地址”是什么意思?我不明白。账单和发货地址存储在同一个表中,我想在我的ORM中使用不同的类来表示它们。为此,我需要基于IsBilling位字段进行引用联接。如果您希望它们由不同的类表示,我建议在IsBilling字段上使用带有鉴别器的子类映射。谢谢,我将使用它来代替。。。然而,如果不能有条件地引用地址,这对我没有好处。你说的“有条件地引用地址”是什么意思?我不明白。账单和发货地址存储在同一个表中,我想在我的ORM中使用不同的类来表示它们。为了做到这一点,我需要基于IsBilling位字段进行引用联接。如果您希望它们由不同的类表示,我建议在IsBilling字段上使用带有鉴别器的子类映射。