gpt4 book ai didi

Nhibernate 映射 - 生成 "native"表示必须手动分配 ID

转载 作者:行者123 更新时间:2023-12-02 05:40:54 25 4
gpt4 key购买 nike

我有两个表,一个叫做 QuestionText,另一个叫做 State。当我对 QuestionText 调用 SaveOrUpdate() 时,它保存得很好,但是当我为 State 调用 SaveOrUpdate() 时,我得到:必须在调用 save() 之前手动分配此类的 ID:Entities.State

每个类的映射是相同的。

关于为什么 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:

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

最佳答案

看了doc才知道更具体地说,这条线 -

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

我通过使用发现了这一点

HbmSerializer.Default.Serialize(
System.Reflection.Assembly.GetAssembly(
typeof(State)), @"C:\temp\EOI.Mappings.xml");

然后查看文件映射是什么。从未创建“生成器”元素。这是因为父节点是在子节点(生成器)之后创建的,这导致“id”元素没有“generator”子元素。所以我改变了我的属性(见下文),它开始工作了

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

关于Nhibernate 映射 - 生成 "native"表示必须手动分配 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10982279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com