Nhibernate映射-生成“;本地的;表示必须手动分配ID

Nhibernate映射-生成“;本地的;表示必须手动分配ID,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有两个表格,一个叫做提问文本,另一个叫做状态。当我对QuestionText调用SaveOrUpdate()时,它可以很好地保存,但当我为State调用SaveOrUpdate()时,必须在调用save():Entities.State之前手动分配该类的ID 每个类的映射都是相同的 关于nHibernate为什么对一个表而不是另一个表的自动生成/标识指定主键这样说的任何想法。。。当映射明显相同时,两者是否相同 这个很好用: [Serializable()] [Class(NameType =

我有两个表格,一个叫做提问文本,另一个叫做状态。当我对QuestionText调用SaveOrUpdate()时,它可以很好地保存,但当我为State调用SaveOrUpdate()时,必须在调用save():Entities.State之前手动分配该类的ID

每个类的映射都是相同的

关于nHibernate为什么对一个表而不是另一个表的自动生成/标识指定主键这样说的任何想法。。。当映射明显相同时,两者是否相同

这个很好用:

[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;
            }
        }
}
更新1:


我删除了状态表,并尝试插入数据。它给了我与上面相同的错误(设置唯一ID)。然后,我删除了QuestionText表并尝试插入,它给出了-{“无效的对象名'eoi.QuestionText.”。那么这是否意味着状态对象(表)存在两次?其他地方?或者在另一个模式下?我知道状态在SQLServer中是一个关键字,所以我想知道这是否是问题的一部分。

尝试用方括号括住
Table=“State”
Table=“[State]”
。这可能是您的数据库抛出了保留关键字。

在阅读后,更具体地说,这一行-

  • 默认情况下,.NET属性不保持属性的顺序;所以 当订单重要时,您需要自己设置(使用第一个 每个属性的参数);强烈建议在以下情况下进行设置: 同一成员上有多个属性
我是通过使用

HbmSerializer.Default.Serialize(
System.Reflection.Assembly.GetAssembly(
typeof(State)), @"C:\temp\EOI.Mappings.xml");
然后看看文件映射是什么。从未创建“生成器”元素。这是因为父节点是在子节点(生成器)之后创建的,这导致“id”元素没有“生成器”子元素。所以我改变了我的属性(见下文),它开始工作

[NHibernate.Mapping.Attributes.Id(0,Name = "StateID",Column="StateID")]
[NHibernate.Mapping.Attributes.Generator(1,Class="native")]
public virtual int? StateID { get; set; }

您是否检查了StateID列是否设置为标识?是的,我确保它的标识设置为true。我将删除并重新创建表。也许这会解决它。