У меня есть устаревшая БД, которая использует 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, но если поможет более свежая сборка, я гибок.