Как свернуть в однозначный родитель-ребенок-столики в классы с свободным Nibernate?

StackOverflow https://stackoverflow.com/questions/4221919

Вопрос

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

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

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. Я предполагаю, что у меня есть три айлиста, один для каждого класса.

Это было полезно?

Решение

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

Затем пользователь будет иметь отношение к множеству, связанным с контактом, и коллекция контактов пользователя будет содержать контакты любого типа.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top