【发布时间】:2010-12-25 17:00:26
【问题描述】:
NHibernate 新手。不知如何映射这个遗留表。
CREATE TABLE [dbo].[CmnAddress](
[addressId] [int] NOT NULL,
[objectType] [varchar](63) NULL,
[objectId] [int] NULL,
[addressType] [varchar](7) NULL,
[recordStatus] [char](1) NULL,
[fromDate] [int] NULL,
[toDate] [int] NULL,
[onStreet] [varchar](254) NULL,
[atStreet] [varchar](254) NULL,
[unit] [varchar](30) NULL,
[city] [varchar](254) NULL,
[state] [varchar](30) NULL,
[zipCode] [varchar](30) NULL,
)
还有一个“CmnPerson”表,我已映射到 Person 类。我需要 Person 类包含地址列表,其中 objectType 列包含“CmnPerson”,objectId 字段与我的 Person.Id (“CmnPerson.personId”) 字段匹配。
我稍后还必须创建一个 Contact 类,该类还包含一个地址列表,其中 objectType 列包含“CmnContact”。
我很难确定是否应该使用 Any 映射或 class-hierarchy-per-table 并区分子列?或者如果其中任何一个都可以满足我的需求。
谁能告诉我如何映射这个地址类?流利的配置会更好。
添加信息:
以下类和映射几乎可以工作,但地址列表返回 CmnAddress 表中具有匹配 objectId 的所有行,而不管 objectType 字段的值如何。我想我可以在 Person.Addresses 的 HasMany 映射上使用 ApplyFilter,但这似乎不是“正确”的方式。
更多补充信息:我能够通过在调用 DiscriminateSubClassesOnColumn(...) 之后链接 AlwaysSelectWithValue() 来解决最后一个问题
public class Person
{
public virtual int Id { get; private set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual string MiddleName { get; set; }
public virtual string Gender { get; set; }
public virtual IList<PassClient> PassClients { get; set; }
public virtual IList<PersonAddress> Addresses { get; set; }
}
public class PersonMap : ClassMap<Person>
{
public PersonMap() {
Table("CmnPerson");
Id(x => x.Id).Column("personId");
Map(x => x.LastName);
Map(x => x.FirstName);
Map(x => x.MiddleName);
Map(x => x.Gender);
HasMany(x => x.PassClients).KeyColumn("personId");
HasMany(x => x.Addresses).KeyColumn("objectId");
}
}
abstract public class Address
{
public virtual int Id { get; private set; }
public virtual string StreetNo { get; set; }
public virtual string OnStreet { get; set; }
public virtual string Unit { get; set; }
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string ZipCode { get; set; }
}
public class PersonAddress : Address {
public virtual Person Person { get; set; }
}
public class AddressMap : ClassMap<Address>
{
public AddressMap() {
Table("CmnAddress");
Id(x => x.Id).Column("addressId");
Map(x => x.StreetNo);
Map(x => x.OnStreet);
Map(x => x.Unit);
Map(x => x.City);
Map(x => x.State);
Map(x => x.ZipCode);
DiscriminateSubClassesOnColumn("objectType").AlwaysSelectWithValue();
}
}
public class PersonAddressMap : SubclassMap<PersonAddress>
{
public PersonAddressMap() {
DiscriminatorValue("CmnPerson");
References(x => x.Person).Column("objectId");
}
}
【问题讨论】:
标签: nhibernate fluent-nhibernate mapping hierarchy legacy