Can*_*cer 9 .net c# nhibernate
当使用NHibernate时,如果我有一个具有唯一约束的实体并且可以通过该约束唯一地识别,那么将约束表示为复合键还是具有单独的Id字段并具有复合唯一约束更好?我一直在读,如果它可以帮助使用复合键和NHibernate被认为是"坏",并且只应在使用旧数据库时使用.
将设置映像如下:
class Book
{
public virtual int Id { get; protected set; }
public virtual string Author { get; set; }
public virtual IList<BookEdition> Editions { get; set; } //HasMany (one to many)
}
class BookEdition
{
public virtual string Title { get; set; }
public virtual string Language { get; set; }
public virtual int Edition { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这里我们对BookEdition有一个约束,它对语言和版本有一个限制,即不能用同一种语言有两个版本的书.任何版本也可以通过版本号和语言进行唯一标识.
在NHibernate中哪种方法被认为更好?使用Language/Edition作为复合Id或为BookEdition引入Id变量并改为使用复合唯一约束?
Surrorgate键(附加的Id变量)通常不仅在NHibernate中更好.自然键(这里:语言和版本)的问题在于它们具有"商业"含义.业务需求会随着时间的推移而发展,您将来必须改变自然键,这可能会非常痛苦.此外,您的SQL连接以及条件将更复杂.
这可能是BookEdition的FNH映射与复合唯一约束:
Id(x => x.Id);
Map(x => x.Title);
Map(x => x.Language).UniqueKey("MyCompositeUniqueConstraint");
Map(x => x.Edition).UniqueKey("MyCompositeUniqueConstraint");
Run Code Online (Sandbox Code Playgroud)
顺便说一句.优良做法是不向客户显示关键值.他们倾向于为他们分配一些商业意义,然后他们也想改变它们:).
| 归档时间: |
|
| 查看次数: |
1904 次 |
| 最近记录: |