NHibernate的新手。无法绕过如何映射这张遗留表格的问题。如何用NHibernate(Fluent)映射这个遗留表?
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类包含地址列表,其中objectType列包含“CmnPerson”,而objectId字段与我的Person.Id(“CmnPerson.personId”)字段匹配。
我也稍后将不得不创建一个Contact类,该类还包含objectType列包含“CmnContact”的地址列表。
我有一个非常艰难的时间搞清楚,如果我应该使用任何映射或类层次结构的每个表与子列的歧视?或者如果其中任何一个甚至可以满足我的需求。
任何人都可以显示我如何映射此地址类吗?流利的配置将是可取的。
ADDED信息:
以下类和映射差不多的工作,但地址列表从CmnAddress表匹配的对象ID返回所有行,而不管对象类型字段的值。我想我可以在Person.Addresses的HasMany映射上使用ApplyFilter,但这看起来不像“正确”的方式。
更多的附加信息:我能够通过调用DiscriminateSubClassesOnColumn(...)
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");
}
}
刚才我刚刚提到了这个完全相同的答案 - 只是完成了测试。 它编译并运行,但Person.Addresses列表返回CmnAddress表中所有具有匹配id值的行,而不管区分列中的值如何。 任何想法如何解决? – 2009-12-11 18:23:28
答案是在DiscriminateSubClassesOnColumn(...)调用之后链接AlwaysSelectWithValue()调用。或者至少它似乎有理想的结果。 – 2009-12-11 18:55:27
对不起,我迟到的回复。这很奇怪。我只是用你的场景进行了一次测试,并且我没有必要指定AlwaysSelectWithValue()。 – asgerhallas 2009-12-14 18:23:16