2010-04-10 2 views
1

У меня есть существующая схема базы данных и вы хотите заменить код доступа к данным на Fluent.NHibernate. Схема базы данных не может быть изменена, поскольку она уже существует в продукте доставки. И предпочтительно, если объекты домена не изменялись или минимально изменялись.FluentNHibernate сопоставление составных внешних ключей

Я имею выполните картирование Trouble одну необычную конструкцию схемы, показанную со следующей структурой таблицы:

CREATE TABLE [Container] (
    [ContainerId] [uniqueidentifier] NOT NULL, 
    CONSTRAINT [PK_Container] PRIMARY KEY (
    [ContainerId] ASC 
) 
) 

CREATE TABLE [Item] (
    [ItemId]  [uniqueidentifier] NOT NULL, 
    [ContainerId] [uniqueidentifier] NOT NULL, 
    CONSTRAINT [PK_Item] PRIMARY KEY (
    [ContainerId] ASC, 
    [ItemId] ASC 
) 
) 

CREATE TABLE [Property] (
    [ContainerId] [uniqueidentifier] NOT NULL, 
    [PropertyId] [uniqueidentifier] NOT NULL, 
    CONSTRAINT [PK_Property] PRIMARY KEY (
    [ContainerId] ASC, 
    [PropertyId] ASC 
) 
) 

CREATE TABLE [Item_Property] (
    [ContainerId] [uniqueidentifier] NOT NULL, 
    [ItemId]  [uniqueidentifier] NOT NULL, 
    [PropertyId] [uniqueidentifier] NOT NULL, 
    CONSTRAINT [PK_Item_Property] PRIMARY KEY (
    [ContainerId] ASC, 
    [ItemId]  ASC, 
    [PropertyId] ASC 
) 
) 

CREATE TABLE [Container_Property] (
    [ContainerId] [uniqueidentifier] NOT NULL, 
    [PropertyId] [uniqueidentifier] NOT NULL, 
    CONSTRAINT [PK_Container_Property] PRIMARY KEY (
    [ContainerId] ASC, 
    [PropertyId] ASC 
) 
) 

Существующая модель предметной области имеет следующую структуру класса:

alt text http://yuml.me/4e2bcb95

Класс недвижимости содержит другие участники, представляющие имя и стоимость имущества. Классы ContainerProperty и ItemProperty не имеют дополнительных членов. Они существуют только для идентификации владельца недвижимости. Классы Container и Item имеют методы, которые возвращают коллекции ContainerProperty и ItemProperty соответственно. Кроме того, класс Container имеет метод, который возвращает коллекцию всех объектов Property в графе объектов. Мое лучшее предположение заключается в том, что это был либо метод удобства, либо унаследованный метод, который никогда не удалялся.

Бизнес-логика в основном работает с Item (как совокупный корень) и работает только с контейнером при добавлении или удалении элементов.

Я пробовал несколько методов для сопоставления этого, но никто не работает, поэтому я не буду включать их сюда, если кто-то не попросит их. Как бы вы нарисовали это?

ответ

1

Mapping должен выглядеть следующим образом:

public sealed class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Table("Categories"); 
     CompositeId() 
      .KeyProperty(c => c.ItemId, "ItemId") 
      .KeyProperty(c => c.CategoryId, "CategoryId"); 
    } 
} 

Примечание:

  1. Категория Класс сущностей должен переопределить Equals() и GetHashCode() методы
  2. Все свойства и методы должны быть виртуальным/перезаписанным!

-

public class Category 
{ 
    public virtual int ItemId { get; set; } 
    public virtual int CategoryId { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != typeof (Category)) return false; 
     return Equals((Category) obj); 
    } 

    public virtual bool Equals(Category other) 
    { 
     if (ReferenceEquals(null, other)) return false; 
     if (ReferenceEquals(this, other)) return true; 
     return other.ItemId == ItemId && other.CategoryId == CategoryId; 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return (ItemId*397)^CategoryId; 
     } 
    } 
} 
Смежные вопросы