为什么NHibernate创建一个没有主键的表?

问题描述:

我们使用nHibernate的schemaExport类创建数据库。我现在有一个具有我们生成nhibernate映射的属性的类。这个类的一个组成部分是:为什么NHibernate创建一个没有主键的表?

public class PluginInstance 
{ 
    ... 
    [Bag(2, Name = "RouteParams", Access = "property", Table = "CMS_PluginInstanceRouteParams")] 
    [Key(3, Column = "ParamId")] 
    [Element(4, Column = "Param", Type = "string")] 
    public virtual IList<String> RouteParams 
    { 
     get { return _routeParamsField; } 
     set { _routeParamsField = value; } 
    } 
    ... 
} 

NHibernate的映射的产生部分是以下

<bag name="RouteParams" access="property" table="CMS_PluginInstanceRouteParams"> 
    <key column="ParamId" /> 
    <element column="Param" type="string" /> 
</bag> 

对于此属性是correcty的“CMS_PluginInstanceRouteParams”创建表时,我们称之为:

var schemaExport = new SchemaExport(configuration); 
schemaExport.Create(false, true); 

但我不知道为什么这个表没有一个主键。生成的结构为database structure

ParamId列正确地是类PluginInstance的表的外键,并且Param栏正确地存储了属性RouteParams的值。

有没有必要在这个表中的主键?是否可以使用NHibernate.Mapping.Attributes来设置此属性的主键?

+0

如果定义的芳族聚酰胺列主键,你就失去了1:N的关系,不是吗?为什么你想在该表中使用主键? – 2011-04-22 22:40:23

+0

您的实体在哪里定义? – 2011-04-22 23:28:19

+0

我想知道为什么这个表没有主键,因为我们使用de vs2010 datacomparer将一些初始数据从临时数据库复制到活动数据库。但由于主键,此表不会显示在比较器中。这个问题不是有关:http://*.com/questions/5700864/visual-studio-2010-datacompare-table-comparison – 2011-04-23 00:39:56

表没有被映射为一个实体,因此绝不会从自身的数据库中获取,因此NHibernate的不需要和不创建该表的主键。

编辑:

如果你想在这个表,我建议添加的是一个额外的列主键。使用ParamId作为主键不适合你。如果您为RouteParams创建一个类和相应的映射文件,NHibernate将使用主键创建表。

+0

感谢这个答案,我认为同样的,但不知道。我会试试这个。 – 2011-04-26 06:01:58