遗留数据库:多对一/引用,没有所有必需的键列

时间:2011-03-25 12:38:49

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个引用(模板)文本的类,该文本对每个租户和每个用例都有几个可能的文本

class Class1
{
    [...]
    public virtual Text TitleName { get; set; }
}

class Text
{
    public virtual int TenantId { get; set; }
    public virtual string Key { get; set; }
    public virtual int Number { get; set; }
    public virtual string Value { get; set; }
}

不幸的是,表结构看起来像

Table Class1
    ...
    textnumber int,

Table Text
    tenant int,
    key varchar (10),
    number int,
pkey(tenant, key, number);

因为Class1总是指租户= 0(所有租户)和key =“class1text”

编辑: 我需要.Where()但是References()doenst只有HasMany()

到目前为止:

public void TextMap : ClassMap<Text>
{
    public TextMap()
    {
       Table("restexts");

       CompositeId()
           .KeyProperty(t => t.TenantId, "tenant")
           .KeyProperty(t => t.Key, "name")
           .KeyProperty(t => t.Number, "number");

       Map(t => t.Value, "content");
    }
}

public void Class1Map : ClassMap<Class1>
{
    public TextMap()
    {
       // mapping rest

       References(c => c.TitleName)
           .Columns("textnumber", ??, ??);  // column 2 and 3 missing, because always the same
    }
}

任何想法?

2 个答案:

答案 0 :(得分:0)

您可以使用FluentNHibernate以这种方式映射您的类,这是一种仅在OneToMany关系中映射一个字段的解决方法。

public Class1()
{
 Table("TableName");
 Id(x => x.MyId).Column("TableId");
 .
 .
 .
 HasMany<TextModel>(x => x.textnumber).KeyColumn("TableField");
}

public Text()
{
 Table("TableName");
 Id(x => x.MyId).Column("TableId");
 .
 .
 .
 References<Class1Model>(x => x.number,"TableColumn");
}

然后你可以在你的查询中添加其他字段的过滤器(tenent = 0和key =“class1text”)

我希望它有用

答案 1 :(得分:0)

耗尽时间我将其映射为Map(c => c.TitleNameId, "textnumber");并且每次我需要titlename时都必须记住租户和密钥名称(使用魔法值:(