Как свернуть таблицы один-один-родитель-класс в классы с помощью Fluent NHibernate? - PullRequest
0 голосов
/ 19 ноября 2010

Как мне сопоставить эти существующие таблицы с классами ниже?

У меня есть следующие таблицы:

CREATE TABLE dbo.UserContact (
  UserContactId int NOT NULL IDENTITY (1, 1),
  UserId int NOT NULL,
  ContactId int NOT NULL,
  UserContactTypeId int NOT NULL,
  FromDt datetime NULL,
  ThruDt datetime NULL,
  CreateDt datetime NOT NULL,
  UpdateDt datetime NULL,
  IsDeleted bit NULL,
  CanSolicit bit NOT NULL
) 

CREATE TABLE dbo.Contact (
  ContactId int NOT NULL IDENTITY (1, 1),
  CreateDt datetime NOT NULL,
  UpdateDt datetime NULL
)

CREATE TABLE dbo.Electronic (
  ContactId int NOT NULL,
  URL nvarchar(512) NOT NULL,
  ElectronicType smallint NULL
)

CREATE TABLE dbo.Phone (
  ContactId int NOT NULL,
  AreaCode nchar(3) NOT NULL,
  PhoneNb nchar(7) NOT NULL,
  Extension nchar(6) NULL,
  PhoneType smallint NULL
)

CREATE TABLE dbo.Postal
(
  ContactId int NOT NULL,
  Street nvarchar(256) NOT NULL,
  Specifier nvarchar(256) NULL,
  GeocodeId int NULL
)

Таблицы Электронный, Телефонный и Почтовый находятся в непосредственном контакте с Контактом. Таблица UserContact во множестве к одному с Контактом; UserContact - это таблица связи между пользователем и контактом.

У меня также есть следующие классы:

public class Electronic : IntegerKeyEntity
{
    public virtual ContactId { get; set; }
    public virtual DateTime CreateDt { get; set; }
    public virtual DateTime? UpdateDt { get; set; }
    public string Url { get; set; }
    public ElectronicType Type { get; set; }
}

public class Postal : IntegerKeyEntity
{
    public virtual ContactId { get; set; }
    public virtual DateTime CreateDt { get; set; }
    public virtual DateTime? UpdateDt { get; set; }
    public string Street { get; set; }
    public string Specifier { get; set; }
    public Geocode Geocode { get; set; }
}

public class Phone : IntegerKeyEntity
{
    public virtual ContactId { get; set; }
    public virtual DateTime CreateDt { get; set; }
    public virtual DateTime? UpdateDt { get; set; }
    public string AreaCode { get; set; }
    public string PhoneNb { get; set; }
    public string Extension { get; set; }
    public PhoneType Type { get; set; }
}

public class UserContact : IntegerKeyEntity
{
    private ICollection<Electronic> electronics = new HashSet<Electronic>();
    private ICollection<Phone> phones = new HashSet<Phone>();
    private ICollection<Postal> postals = new HashSet<Postal>();

    // props

    public virtual IEnumerable<Electronic> Electronics { get { return electronics; } }
    public virtual IEnumerable<Phone> Phones { get { return phones; } }
    public virtual IEnumerable<Postal> Postals { get { return postals; } }
}

Итак, я получу от четырех таблиц контактов (родительских и дочерних) до трех классов? И как мне сопоставить эти три класса с таблицей UserContact. Я предполагаю, что у меня может быть три IList, по одному для каждого класса.

1 Ответ

1 голос
/ 19 ноября 2010

Я думаю, что вы моделируете это неправильно. Мне кажется, что электронные, телефонные и почтовые связи расширяют (наследуют) контакты, и это должно быть отражено в модели вашего домена. Эти классы не связаны с Контактом один-к-одному, это конкретные типы, расширяющие абстрактный тип Контакта. Если вы смоделируете это таким образом, вы можете отобразить контакт, используя отображение наследования таблиц на подклассы .

В этом случае пользователь будет иметь связь «многие ко многим» с «Контактом», а коллекция контактов пользователя будет содержать контакты любого типа.

Лично я бы поместил все типы контактов в одну таблицу и использовал бы более простое отображение таблицы на класс.

...