Свободный NHibernate - Отдельное отображение таблицы - PullRequest
0 голосов
/ 18 марта 2011

Есть ли способ настроить отображение для таблицы, которая не имеет прямой ссылки на другую таблицу? На самом деле он получает ссылку из другой таблицы, на которую у меня есть прямая ссылка.

Это то, что у меня есть, но я не уверен, как отобразить «LookupValue» в моей модели метаданных. Требуется сопоставление с метаданными, если [mdd] .DefinitionType равен [mdl] .LookupType, а [md] .DataValue равно [mdl] .LookupKey.

public class MetaData {
    public virtual long TableID { get; set; }
    public virtual MetaDataDefinition Definition { get; set; }
    public virtual int DefinitionID { get; set; }
    public virtual String DataValue { get; set; }
    public virtual MetaDataLookup LookupValue { get; set; }

    public override bool Equals(object obj) { ... }
    public over int GetHashCode() { ... }
}

public class MetaDataDefinition {
    public virtual long ID { get; set; }
    public virtual string DefinitionName { get; set; }
    public virtual string DefinitionType { get; set; }
}

public class MetaDataLookup {
    public virtual string Type { get; set; }
    public virtual string LookupKey { get; set; }
    public virtual string LookupValue { get; set; }

    public override bool Equals(object obj) { ... }
    public over int GetHashCode() { ... }
}

public class MetaDataMap : ClassMap<MetaData> {
    public MetaDataMap() {
        Table("PPOMetaData");
        CompositeId()
            .KeyProperty(x => x.TableID, "TableID")
            .KeyProperty(x => x.DefinitionID, "DefinitionID");

        References(x => x.Defintion, "DefinitionID").Not.LazyLoad().Cascade.All().Fetch.Join();
        Map(x => x.TableID);
        Map(x => x.DataValue);
    }
}
public class MetaDataDefinitionMap : ClassMap<MetaDataDefinition> {
    public MetaDataDefinitionMap() {
        Table("MetaDataDefinitions");
        Id(x => x.ID);
        Map(x => x.DefinitionName);
        Map(x => x.Type);
    }
}

public class MetaDataLookupMap : ClassMap<MetaDataLookup> {
    public MetaDataLookupMap() {
        CompositeId()
            .KeyProperty(x => x.LookupType)
            .KeyProperty(x => x.LookupKey);
        Map(x => x.LookupValue);
    }
}

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

SELECT     data.TableID, data.DefinitionID, def.DefinitionName, data.DataValue,lu.LookupValue AS DataValue
FROM         dbo.PPOMetadata AS data 
    INNER JOIN dbo.MetaDataDefinitions AS def ON def.ID = data.DefinitionID 
    LEFT OUTER JOIN dbo.MetaDataLookup AS lu ON lu.LookupType = def.Type AND lu.LookupKey = data.DataValue
WHERE data.TableID = 1

С точки зрения возможностей обновления, единственное, что я когда-либо создавал, обновлял или удалял, было бы в таблице метаданных. Определения и значения Lookup никогда не изменятся (по крайней мере, из этой части приложения). Возможно ли привязать «MetaDataLookup» непосредственно к модели MetaData? Если да, может ли кто-нибудь указать мне правильное направление, на которое я должен смотреть?

Спасибо!

1 Ответ

0 голосов
/ 18 марта 2011

Я нашел обходной путь, который, кажется, работает и может устранить некоторые сложности. Вместо того чтобы пытаться обрабатывать сложные объединения в ClassMap, я построил представление в Sql Server, которое делает это для меня. В моем приложении я построил новую модель и ClassMap для представления. Я еще не реализовал какую-либо логику обновления, но я думаю, что у меня будет логика обновления, работающая непосредственно с моделью MetaData, в то время как логика чтения (для которой нужно все объединить) будет использовать новую модель MetaDataView.

Мне все еще любопытно, возможны ли такие сложные объединения в Fluent NHibernate, но сейчас это решение, похоже, работает для меня.

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