当使用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; }
}

在这里,我们对BookEdition有一个约束,在其中它对语言和版本都有约束,即,不能有两种版本的书使用相同的语言。任何版本也可以通过版本号和语言来唯一标识。

在NHibernate中哪种方法更好?使用Language/Edition作为复合ID或为BookEdition引入Id变量,并使用复合唯一约束?

最佳答案

一般来说,不仅在NHibernate中,替代键(附加ID变量)更好。自然键(这里是语言和版本)的问题在于它们具有“业务”含义。业务需求会随着时间的推移而变化,将来您肯定必须更改自然键,这可能会非常痛苦。此外,您的SQL联接以及条件将变得更加复杂的地方。

这可能是具有复合唯一约束的BookEdition的FNH映射:

    Id(x => x.Id);
    Map(x => x.Title);
    Map(x => x.Language).UniqueKey("MyCompositeUniqueConstraint");
    Map(x => x.Edition).UniqueKey("MyCompositeUniqueConstraint");

顺便提一句。最好不要向客户展示过多的关键值(value)。他们倾向于给他们分配一些商业意义,然后他们也想改变它们:)。

关于c# - NHibernate复合键与复合唯一约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5705688/

10-12 03:43