【问题标题】:NHibernate 3.3 - How to Save Child ObjectsNHibernate 3.3 - 如何保存子对象
【发布时间】:2014-01-28 14:55:15
【问题描述】:

我可能已经阅读了与此问题类似的每篇 Stackoverflow 帖子,但无法弄清楚发生了什么。

我必须对学生和教育背景进行分类,一个学生可以有一个或多个教育背景,从而形成一对多的关系。

映射文件:

Student.hbm.xml

<class name="Student" table="student">
<id name="Id" column="id">
  <generator class="guid" />
</id>
<property name="Code" column="code" />
<property name="DateTimeCreated" column="datetime_created" />
<property name="FirstName" column="first_name" />
<property name="MiddleName" column="middle_name" />
<property name="LastName" column="last_name" />
<property name="BirthDate" column="birth_date" />
<property name="HomePhone" column="home_phone" />
<property name="Mobile" column="mobile" />
<property name="HomeAddress" column="home_address" />
<property name="CountryCode" column="country_code" />
<property name="ZipCode" column="zip_code" />
<property name="MotherName" column="mother_name"/>
<property name="MotherAddress" column="mother_address" />
<property name="MotherContactNo" column="mother_contact_no" />
<property name="FatherName" column="father_name" />
<property name="FatherAddress" column="father_address" />
<property name="FatherContactNo" column="father_contact_no" />
<property name="CreatedById" column="created_by_id" />
<bag name="EducationalBckgrnd" table="student_educ_bckgrnd" inverse="true" cascade="all">
  <key column="student_id" />
  <one-to-many class="StudentEducBckgrnd" />
</bag>

StudentEducBckgrnd.hbm.xml

<class name="StudentEducBckgrnd" table="student_educ_bckgrnd">
<id name="Id" column="id">
  <generator class="guid" />
</id>
<!--<property name="StudentId" column="student_id" type="System.Guid" insert="false" />-->
<property name="SchoolName" column="school_name" />
<property name="Remarks" column="remarks" />
<property name="From" column="from" />
<property name="To" column="to" />

<many-to-one name="EnrolledStudent" class="Student" column="student_id" />

如果我不注释掉上面的 StudentId 属性,我会得到参数索引错误。

Student.cs

public class Student
{
    public virtual IList<StudentEducBckgrnd> EducationalBckgrnd { get; set; }
    public virtual Guid Id { get; set; }
    public virtual string Code { get; set; }
    public virtual DateTime DateTimeCreated { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string MiddleName { get; set; }
    public virtual string LastName { get; set; }
    public virtual DateTime BirthDate { get; set; }
    public virtual string HomePhone { get; set; }
    public virtual string Mobile { get; set; }
    public virtual string HomeAddress { get; set; }
    public virtual string CountryCode { get; set; }
    public virtual string ZipCode { get; set; }
    public virtual string MotherName { get; set; }
    public virtual string MotherAddress { get; set; }
    public virtual string MotherContactNo { get; set; }
    public virtual string FatherName { get; set; }
    public virtual string FatherAddress { get; set; }
    public virtual string FatherContactNo { get; set; }
    public virtual Guid CreatedById { get; set; }

    public Student()
    {
        EducationalBckgrnd = new List<StudentEducBckgrnd>();
    }
}

StudentEducBckgrnd.cs

public class StudentEducBckgrnd
{
    public virtual Guid Id { get; set; }
    public virtual Guid StudentId { get; set; }
    public virtual string SchoolName { get; set; }
    public virtual string From { get; set; }
    public virtual string To { get; set; }
    public virtual string Remarks { get; set; }

    public virtual Student EnrolledStudent { get; set; }
}

如果我使用上述所有代码,我会收到以下错误:

NHibernate.Exceptions.GenericADOException was caught

HResult=-2146232832 消息=无法插入:[EnrollmentSystem.Domain.StudentEducBckgrnd#6a0fdb25-18ad-4658-b8b3-e62b8d220649][SQL:INSERT INTO student_educ_bckgrnd(学校名称,备注,从,到,学生ID,ID)值(?,?,?, ?, ?, ?)] 来源=NHibernate SqlString=INSERT INTO student_educ_bckgrnd (school_name, comments, from, to, student_id, id) VALUES (?, ?, ?, ?, ?, ?) 堆栈跟踪: 在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象 id,对象 [] 字段,布尔 [] notNull,Int32 j,SqlCommandInfo sql,对象 obj,ISessionImplementor 会话) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象 id,对象 [] 字段,对象 obj,ISessionImplementor 会话) 在 NHibernate.Action.EntityInsertAction.Execute() 在 NHibernate.Engine.ActionQueue.Execute(IExecutable 可执行文件) 在 NHibernate.Engine.ActionQueue.ExecuteActions(IList 列表) 在 NHibernate.Engine.ActionQueue.ExecuteActions() 在 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource 会话) 在 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent 事件) 在 NHibernate.Impl.SessionImpl.Flush() 在 NHibernate.Transaction.AdoTransaction.Commit() 在 d:\Admiral\projects\EnrollmentSystem\EnrollmentSystem\Business\CStudent.cs:line 54 中的 EnrollmentSystem.Business.CStudent.SaveStudent(Student student, List`1 educationList) 内部异常:MySql.Data.MySqlClient.MySqlException H结果=-2147467259 Message=您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'from, to, student_id, id) VALUES ('fdsaf', 'asdf', '2014-01-28', '2014-01-28 ', '' 在第 1 行 来源=MySql.Data 错误代码=-2147467259 数量=1064 堆栈跟踪: 在 MySql.Data.MySqlClient.MySqlStream.ReadPacket() 在 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& 影响行,Int64& 插入 ID) 在 MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId,Int32& 受影响的Rows,Int64& 插入的Id) 在 MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId,布尔力) 在 MySql.Data.MySqlClient.MySqlDataReader.NextResult() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为) 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 在 NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd) 在 NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation 期望) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(对象 id,对象 [] 字段,布尔 [] notNull,Int32 j,SqlCommandInfo sql,对象 obj,ISessionImplementor 会话) 内部异常:

我正在使用 MySQL 并且正在构建一个 C# winforms 应用程序,该错误告诉我我遇到了 SQL 语法错误,但我无法弄清楚原因。

任何帮助将不胜感激。

NEWBIE

【问题讨论】:

    标签: c# winforms nhibernate nhibernate-mapping


    【解决方案1】:

    这里的问题在于关键字。这个映射

    <property name="From" column="from" />
    

    说,列名是from。但是FROM 是关键字(几乎适用于我打赌的任何数据库引擎......)。所以我们需要做的是使用特殊符号来逃避该设置:`

    (我不太确定那个标志,因为在 MS SQL Server 上我确实使用这种风格:[from]

    <property name="From" column="`from`" />
    

    同时检查异常

    ...在 'from, to, student_id,... 附近使用正确的语法

    顺便说一下,两次使用的列的正确映射是这样的

    <many-to-one  name="EnrolledStudent" class="Student"  column="student_id" />
    <property     name="StudentId"    type="System.Guid"  column="student_id" 
                  insert="false" update="false" />
    

    在这种情况下,INSERT 或 UPDATE 将只使用一次列 student_id,即引用映射

    【讨论】:

    • 你救了我的命!我睡不着想我做错了什么,所以我躺在床上等待有人回答,现在我可以睡得很好,明天继续前进,天哪!谢谢你,伙计!
    • 伟大的先生 ;) 您不必哭泣...享受 NHibernate。很棒的工具
    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多