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,
)
Person クラスにマップした「CmnPerson」テーブルもあります。Person クラスに Addresses のリストを含める必要があります。objectType 列には「CmnPerson」が含まれ、objectId フィールドは Person.Id ("CmnPerson.personId") フィールドと一致します。
また、後で、objectType 列に「CmnContact」が含まれる Addresses のリストも含む Contact クラスを作成する必要があります。
サブカラムを区別して Any マッピングまたは class-hierarchy-per-table を使用する必要があるかどうかを判断するのに非常に苦労していますか? または、それらのいずれかが私のニーズを満たしている場合。
この Address クラスをマップする方法を誰かに教えてもらえますか? 流暢な構成が望ましいでしょう。
追加情報:
次のクラスとマッピングはほとんど機能しますが、Addresses リストは、objectType フィールドの値に関係なく、一致する objectId を持つ CmnAddress テーブルからすべての行を返します。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");
}
}