NHibernate: несколько сопоставлений в одну таблицу - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть класс, который я хотел бы сопоставить с одной таблицей двумя различными способами из соображений конфиденциальности.Допустим, класс выглядит следующим образом:

class Person
{
   public int ID { get; set; }
   public string Name { get; set; }
   // ... many other properties omitted ...
}

И соответствующая таблица базы данных выглядит следующим образом:

create table Person
(
   ID int not null,
   RealName nvarchar(512) not null,
   FakeName nvarchar(512) not null,
   -- many other columns omitted
)

Мне нужно два сопоставления:

  • От Имя свойство до Реальное имя Столбец
  • От Имя Свойство до Ложное имя Столбец

Все остальные свойства должны отображаться одинаково в обоих случаях.Я настоятельно предпочитаю не повторять сопоставления для этих других свойств.

Я попробовал несколько разных подходов, но безуспешно.Использование изолировать различные сопоставления не удается с этой ошибкой: DuplicateMappingException: дублирующее сопоставление таблицы Person .Я мог бы создать два разных представления базы данных и отобразить их отдельно, чтобы избежать ошибки отображения дублирующихся таблиц, но это не является предпочтительным.

Использование атрибута "entity-name" дляуказывать сопоставления заманчиво, но плохо документировано и, по-видимому, имеет ряд существенных недостатков: а) требуется повторение всех остальных сопоставлений для обоих объектов, и б) оно не совместимо сотношения из других классов, которые относятся к классу Person.

Есть ли хороший способ сделать это, которого мне не хватает?

Ответы [ 2 ]

0 голосов
/ 02 июля 2014

Даже если я полагаю, что ОП каким-то образом решил свою проблему, я хотел бы предложить решение с использованием проекций.

По сути, на уровне доступа к данным (DAL) вы выбираете немного большесложный способ получить доступ к вашим данным, используя список проекций, но получить экземпляры нужного класса FakePerson или RealPerson в зависимости от вашей логики.

Это будет выглядеть примерно так:

FakePerson alias = null;
var person = _session.QueryOver<Person>()
    .SelectList(list => list
        .Select(go => go.Id).WithAlias(() => alias.Id)
        .Select(go => go.FakeName).WithAlias(() => alias.Name) // <- the trick
        .Select(go => go.Other).WithAlias(() => alias.Other)
    .TransformUsing(Transformers.AliasToBean<FakePerson>());

Вы по-прежнему сопоставляете свой класс Person с обоими свойствами FakeName и RealName, но делаете их protected и получаете FakePerson и RealPerson из Person с открытым свойством Name.

Я понимаю, что вам все еще нужно перечислить все свойства дважды, он только что перешел из отображения в DAL.Ну, может, это кому-то поможет, в любом случае.

0 голосов
/ 23 февраля 2012

Вы можете использовать атрибут формулы NHibernate для соответствия свойству Name следующим образом:

<property name="Name" formula="(SELECT id,(CASE WHEN yourcondition then RealName else FakeName end) as Name FROM Person)"/>

Формула, которую вы можете изменить - http://blog.khedan.com/2009/01/eager-loading-from-formula-in.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...