【发布时间】:2012-09-30 13:31:05
【问题描述】:
我有一个简单的类,它有一个Name 成员,用于唯一标识一个实例。这个类在 ManyToMany-mapping 中被引用,它将使用Name(因为它是主键)来创建映射表。所涉及的字符串类型使得这非常慢(长度 > 128 个字符,通常只在最后几个不同)。为了加快速度,我想为连接创建一个 auto_increment 列(我正在使用 MySQL),同时仍然能够让 nhibernate 使用 Name-column 对我的对象的唯一性进行排序。
这是一个外观示例。实际上,这些对象要大得多。
class MyObject{
public String Name;
public String Value;
}
//Mapping
Id(x => x.Name)
.Length(255)
.Unique();
Map(x => x.Value);
这按预期工作。如果我向表中添加一个新的MyObject,nhibernate 将首先进行选择以查看具有相同Name 的记录是否已经在表中。
我有一个ObjectHolder,它有一组MyObject
class ObjectHolder{
public UInt64 Id;
public ICollection<MyObject> MyObjects;
}
//Mapping
Id(x => x.Id)
.GeneratedBy.Native();
HasManyToMany(x => x.MyObjects)
.AsSet()
.Cascade.SaveUpdate();
这将使用ObjectHolder.Id 和MyObject.Name 创建一个映射,这很慢。我希望MyObject 有一个自动生成的 Id 列,仅用于映射表,但不用于 nhibernate 对主键所做的 select-to-see-if-it-exists-checking。
我已将映射更改为
class MyObject{
public UInt64 Id;
public String Name;
public String Value;
}
//Mapping
Id(x => x.Id)
.GeneratedBy.Native();
Map(x => x.Name)
.Length(255)
.Unique();
Map(x => x.Value);
这将创建一个 auto_increment 列并将其用于映射表,但它现在将不再正确检查是否已经存在具有相同 Name 的记录,这会导致重复条目异常。
我可以告诉 nhibernate 检查 Name 列而不是 id,或者注释 Id-column 以便它仅用作外键,而不是别的吗?我必须修改 manyToMany 映射吗?
编辑:如果我必须使用复合 id 似乎更糟。所有 id 属性都保存了两次,一次在对象本身中,一次在映射中,这增加了巨大的时间和存储空间开销。
【问题讨论】:
标签: nhibernate fluent-nhibernate nhibernate-mapping