如何使用compositionID成功地在nhibernate中映射多个到多个表并仍然直接保存到它?

时间:2014-01-24 19:29:26

标签: nhibernate

我的代码中有一堆GUID常量用于某些在我的应用程序中很重要的标记类别。这被映射到一个简单的两列多对多表中。我经常想避免获取nhibernate对象,因为我真正需要的只是GUID并且它已经是硬编码的。我还注意到使用直接表访问进行某些查询会更快更容易。因此,我们的目标是将那些nhibernate许多表映射为一个类,这样它们就可以被读取和写入,而不会破坏常规意义上的nhibernates使用;同时使用GUID作为标识符。

无论如何,我已经决定在nhibernate生成的两列中使用一个compositionID。但有一个问题。 如果我使用撰写的ID并创建一个Category标记对象并尝试直接保存我的TagID和CategoryTag ID,则TagID会保存到CategoryTagID列,而CategoryTagID会保存到TagID列中!

public class CategoryTagMapping : ClassMapping<CategoryTag>
{
    public CategoryTagMapping ()
    {
        Table("CategoryTag");
        /*Id(x => x.ID, map => map.Generator(Generators.Guid));*/
        Property(x => x.CategoryTagID, map => { map.Column("CategoryTagID");});
        Property(x => x.TagID, map => { map.Column("TagID"); });
        ComposedId(p =>
        {
            p.Property(p1 => p1.CategoryTagID, a => a.Column("TagID"));
            p.Property(p1 => p1.TagID, a => a.Column("CategoryTagID"));
        }); 
    }


}
public class CategoryTag 
{
    /*public virtual Guid ID {get;set;}*/
    public virtual Guid CategoryTagID { get; set; }
    public virtual Guid TagID { get; set; }


    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        var t = obj as CategoryTag;

        if (t == null)
            return false;

        if (this.CategoryTagID == t.CategoryTagID && this.TagID == t.TagID)
            return true;

        return false;
    }

    public override int GetHashCode()
    {
        return (this.CategoryTagID + "|" + this.TagID).GetHashCode();
    }

}

尝试这样做:

 CategoryTag A = new CategoryTag { CategoryTagID = Constants.GUID1, TagID = Constants.GUID2 };

如果我通过取消注释两行来添加ID列,则保存正常。但是这会破坏表的常规用法,因为mysql不能自动增加guid字段,而nhibernate不会生成ID进入ID列。

无论如何,也许这是一个错误,但也许有一个解决方法。映射或者equals / gethashcode是否有问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

我很蠢。 heapID映射部分中的列不匹配。