流畅的NHibernate - 分离表映射

时间:2011-03-18 16:11:33

标签: c# nhibernate fluent-nhibernate

有没有办法可以为没有直接引用另一个表的表设置映射?它实际上得到了另一个表的引用,我确实有来自的直接引用。

这是我到目前为止所做的,但我不确定如何在我的MetaData模型中映射“LookupValue”。如果[mdd] .DefinitionType等于[mdl] .LookupType并且[md] .DataValue等于[mdl] .LookupKey,则需要映射到MetaData。

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

就更新能力而言,我唯一能创建,更新或删除的东西都在MetaData表中。定义和查找值永远不会改变(至少从应用程序的这一部分)。是否可以将“MetaDataLookup”直接映射到MetaData模型?如果是这样,有人能指出我应该看的正确方向吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想出了一个似乎有效的解决方法,可能会带来一些复杂性。我没有尝试处理ClassMap中的复杂连接,而是在Sql Server中构建了一个为我执行此操作的视图。在我的应用程序中,我为视图构建了一个新的Model和ClassMap。我还没有实现任何更新逻辑,但我认为我将直接在MetaData模型上使用更新逻辑,而读取逻辑(需要所有连接在一起的)将使用新的MetaDataView模型。

我仍然很好奇,如果在Fluent NHibernate中可以进行这样的复杂连接,但是现在这个解决方案对我来说似乎很有用。