Отображение словаря в Fluent Nhibernate через вторичный ключ - PullRequest
1 голос
/ 10 ноября 2009

У меня есть устаревшая БД, которая использует guid для отображения дочерних элементов в родительский объект.

В моем доменном слое я бы предпочел скрыть эту причуду, поэтому мне бы хотелось, чтобы моя родительская сущность выглядела так:

public class Parent
{
    virtual public int Id {get; protected set; }
    virtual public string ParentContent { get; set; }
    virtual public Guid ReferenceId { get; set; }
    virtual public IDictionary<int,Child> Children { get; set; }
}

public class Child
{
    virtual public int Id { get; protected set; }
    virtual public Parent { get; set; }
    virtual public string ChildContent { get; set; }
}

Затем родительский элемент сопоставляет каждый Child.Id с Child в словаре Children. Дочернее отображение работает нормально, но я не могу найти разумное отображение для родителя.

Поле с именем ParentReferenceID существует в родительских и дочерних таблицах, поэтому я попытался сопоставить это с чем-то вроде этого:

        mapping.HasMany<Broker>(x => x.Children)
            .Table("Child")
            .KeyColumn("ParentReferenceID")
            .Inverse()
            .AsMap<long>(index=>index.Id,val=>val.Type<Broker>());

К сожалению, это приводит к ошибке: Тип или метод имеет 2 универсальных параметра (ов), но были предоставлены 1 универсальный аргумент (ы). Универсальный аргумент должен быть предоставлен для каждого универсального параметра.

Чтобы упростить мою проблему, я начал с семантики Bag, заменив IDictionary родительского элемента на IList. Это было сопоставлено с использованием чего-то вроде:

  mapping.HasMany<Broker>(x => x.Brokers)
     .Table("Child")
     .KeyColumn("ParentReferenceId")
     .Inverse()
     .AsBag();

Это производит более очевидное исключение, System.Data.SqlClient.SqlException: тип операнда clash: uniqueidentifier несовместим с int

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

Для ясности я использую сборку Fluent, которая поставляется в комплекте с недавней SharpArchitecture, созданной из git. Библиотека Fluent dll помечена как версия 1.0.0.594, но если поможет более свежая сборка, я гибок.

1 Ответ

0 голосов
/ 11 ноября 2009

Дальнейшие раскопки привели меня к решению проблемы с сумкой, хотя словарь все еще доставляет мне немного хлопот.

Для решения требуется исправление для класса сопоставления OneToManyPart Fluent NHibernate. (Подсказка к Этот отчет об ошибке: не удалось сопоставить отношение «один ко многим», где ключ не является первичным ключом .

   mapping.HasMany(x => x.Children)
       .Table("Child").KeyColumn("ParentReferenceId")
       .PropertyRef("ReferenceId")
       .Inverse()
       .AsBag();

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

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