我有两个表,一个叫做QuestionText,另一个叫做State。当我将SaveOrUpdate()调用到QuestionText时,它保存得很好,但是当我为State I调用SaveOrUpdate()时得到:在调用save()之前必须手动分配此类的ID:Entities.State
每个班级的映射都是一样的。
关于为什么nHibernate为一个表而不是另一个表指定自动生成的/ Identity指定的主键的任何想法...当映射显然都是相同的?
这个很好用:
[Serializable()]
[Class(NameType = typeof(QuestionText), Table = "QuestionText", Schema = "eoi")]
public class QuestionText
{
#region Public Properties
[NHibernate.Mapping.Attributes.Generator(Class = "native")]
[NHibernate.Mapping.Attributes.Id(Name = "QuestionTextID")]
public virtual int? QuestionTextID { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string QuestionDescription { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string QuestionCategory { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string QuestionDisplayTitle { get; set; }
#endregion
}
这个没有:
[Serializable()]
[Class(NameType = typeof(State), Table = "State", Schema = "eoi")]
public class State
{
#region Public Properties
[NHibernate.Mapping.Attributes.Generator(Class = "native")]
[NHibernate.Mapping.Attributes.Id(Name = "StateID")]
public virtual int? StateID { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string StateAbbreviation { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string StateName { get; set; }
#endregion //Public Properties
}//end of class
和我的保存方法:
internal T Save(T obj)
{
using (ISession dbSession = EOIDB.GetSession())
using (ITransaction transaction = dbSession.BeginTransaction())
{
try
{
dbSession.SaveOrUpdate(obj);
transaction.Commit();
return obj;
}
catch (Exception ex)
{
transaction.Rollback();
throw ex;
}
}
}
UPDATE1:
我删除了State表,并尝试插入数据。它给了我与上面相同的错误(设置唯一ID)。然后我删除了QuestionText表并尝试插入,它给了 - {“无效的对象名称'eoi.QuestionText'。”}。那么这是否意味着State对象(表)存在两次?别的地方?或者可能在另一个架构下?我知道State是SQLServer中的关键字,所以我想知道这是否可能是问题的一部分。
答案 0 :(得分:4)
在阅读doc之后,更具体地说是行 -
我通过使用
发现了这一点HbmSerializer.Default.Serialize(
System.Reflection.Assembly.GetAssembly(
typeof(State)), @"C:\temp\EOI.Mappings.xml");
然后查看文件映射是什么。从未创建过'Generator'元素。这是因为父节点是在子节点(生成器)之后创建的,这导致'id'元素没有'generator'子元素。所以我改变了我的属性(见下文)并开始工作
[NHibernate.Mapping.Attributes.Id(0,Name = "StateID",Column="StateID")]
[NHibernate.Mapping.Attributes.Generator(1,Class="native")]
public virtual int? StateID { get; set; }
答案 1 :(得分:1)
请尝试用方括号括起Table="State"
:Table="[State]"
。可能是您的数据库丢失了保留关键字。