我的代码中有一堆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是否有问题?
谢谢!
答案 0 :(得分:0)
我很蠢。 heapID映射部分中的列不匹配。