为什么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);
但我不知道为什么这个表没有一个主键。生成的结构为
ParamId列正确地是类PluginInstance的表的外键,并且Param栏正确地存储了属性RouteParams的值。
有没有必要在这个表中的主键?是否可以使用NHibernate.Mapping.Attributes来设置此属性的主键?
答
表没有被映射为一个实体,因此绝不会从自身的数据库中获取,因此NHibernate的不需要和不创建该表的主键。
编辑:
如果你想在这个表,我建议添加的是一个额外的列主键。使用ParamId作为主键不适合你。如果您为RouteParams
创建一个类和相应的映射文件,NHibernate将使用主键创建表。
+0
感谢这个答案,我认为同样的,但不知道。我会试试这个。 – 2011-04-26 06:01:58
如果定义的芳族聚酰胺列主键,你就失去了1:N的关系,不是吗?为什么你想在该表中使用主键? – 2011-04-22 22:40:23
您的实体在哪里定义? – 2011-04-22 23:28:19
我想知道为什么这个表没有主键,因为我们使用de vs2010 datacomparer将一些初始数据从临时数据库复制到活动数据库。但由于主键,此表不会显示在比较器中。这个问题不是有关:http://stackoverflow.com/questions/5700864/visual-studio-2010-datacompare-table-comparison – 2011-04-23 00:39:56