nhibernate不匹配的感受

发布于 2025-01-22 23:37:01 字数 6582 浏览 5 评论 0原文

我有一个DB处理应用程序,其中我遇到了一个问题,同时将许多关系的对象更新为。我有一个表设备和一个表格,可以与第三个表Advenances_devices相互连接。每个设备都可以接收多次,每个设备都可以使用多个设备。 我将映射和课程放在下面,

public class Device
    {
        public Device()
        {
            Admittances = new List<Admittance>();
        }
        public virtual int ID { get; set; }
        public virtual string SerialNumber { get; set; }
        public virtual Manufacturer Manufacturer { get; set; }
        public virtual Model Model { get; set; }
        public virtual Volume Volume { get; set; }
        public virtual Type Type { get; set; }
        public virtual string Distinguishing { get; set; }
        public virtual IList<Admittance> Admittances { get; set; }
    }

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MeraserwHub.DBClasses" assembly="MeraserwHub">
    <class name="Device" table="Devices">
        <id name="ID" column="DeviceID" >
            <generator class="identity" />
        </id>
        <property name="SerialNumber" column="SerialNumber" />
        <property name="Distinguishing" column="Distinguishing" />
    
        <many-to-one name="Manufacturer" lazy="proxy" unique="true" column="Manufacturer" not-found="ignore" cascade="all-delete-orphan"/>
        <many-to-one name="Model" lazy="proxy" unique="true" column="Model" not-found="ignore" cascade="all-delete-orphan"/>
        <many-to-one name="Volume" lazy="proxy" unique="true" column="Volume" not-found="ignore" cascade="all-delete-orphan"/>
        <many-to-one name="Type" lazy="proxy" unique="true" column="Type" not-found="ignore" cascade="all-delete-orphan"/>

        <bag name="Admittances" table="Admittances_Devices" inverse ="true" lazy="true" cascade="save-update">
            <key column="DeviceID"/>
            <many-to-many class="Admittance" column="AdmittanceID"/>
        </bag>
    </class>
</hibernate-mapping>

public class Admittance
    {
        public Admittance()
        {
            Devices = new List<Device>();
        }
        public virtual int ID { get; set; }
        public virtual string Number { get; set; }
        public virtual Client Client { get; set; }
        public virtual User User { get; set; }
        public virtual DateTime Date { get; set; }
        public virtual string Notes { get; set; }
        public virtual IList<Device> Devices { get; set; }
    }

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MeraserwHub.DBClasses" assembly="MeraserwHub">
    <class name="Admittance" table="Admittances">
        <id name="ID" column="AdmittanceID" >
            <generator class="native" />
        </id>
        
        <property name="Number" column="Number" />
        <property name="Date" column="Date" />
        <property name="Notes" column="Notes" />
        
        <many-to-one name="User" lazy="proxy" column="[User]" />
        <many-to-one name="Client" lazy="proxy" column="Client" />

        <bag name="Devices" table="Admittances_Devices" cascade="save-update" generic="true">
            <key column="AdmittanceID"/>
            <many-to-many class="Device" column="DeviceID"/>
        </bag>
    </class>
</hibernate-mapping>

当我想更新设备并入场时, 以便我可以在每个表中添加记录,我会遇到一个错误。您可以找到方法的代码和下面的错误。

Device device = menu.allDevicesList[cbx_serialNum.SelectedIndex];

device.Admittances.Add(toAddAdmittance); `toAddAdmittance is an object defined earlier`
toAddAdmittance.Devices.Add(device); 
dbConnection.UpdateDevice(device); `dbConnection is NHibernate class object`
dbConnection.UpdateAdmittance(toAddAdmittance);

   public void UpdateDevice(Device device) `the method for admittances looks exactly the same`
        {
            try
            {
                using (mySession.BeginTransaction())
                {
                    mySession.Query<Device>()
                      .Where(a => a.ID == device.ID)
                      .UpdateBuilder()
                      .Set(a => a.SerialNumber, device.SerialNumber)
                      .Set(a => a.Manufacturer, device.Manufacturer)
                      .Set(a => a.Model, device.Model)
                      .Set(a => a.Volume, device.Volume)
                      .Set(a => a.Type, device.Type)
                      .Set(a => a.Distinguishing, device.Distinguishing)
                      .Set(a => a.Admittances, device.Admittances)
                      .Update();

                    mySession.Transaction.Commit();
                }
                //MessageBox.Show("Dane urządzenia zostały zaktualizowane");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

错误具有内部异常“不匹配的treenodeexception(140!= 3)”,堆栈跟踪如下。对于入学,我会遇到相同的错误。


w NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
w NHibernate.ql.AsStŁ.ANT LR.Exec.BasicExecutor..ctor(lStatement
statement, IQueryable persister)
w
NHibernate.Hql.Ast.ANTLR.QueryTranslatorlmpl.BuildAppropriatestatem
entExecutor(lStatement statement)
w
NHibernate.Hql.Ast.ANTLR.QueryTranslatorlmpl.DoCompile(lDictionary2
replacements, Boolean shallow, 5tring collectionRolej
w
NHibernate.Hql.AsŁANTLR.ASTQueryTranslatorFactory.CreateQueryTransl
ators(IQueryExpression queryExpression, IASTNode ast, String
queryldentifier, String collectionRole, Boolean shallow, IDictionary2
filters, ISessionFactorylmplementorfactory]
w
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTransl
ators(IQueryExpression queryExpression, String collectionRole, Boolean
shallow, IDictionary2 filters, ISessionFactorylmplementorfactory]
w
NHibernate.Engine.Query,.QueryPlanCache.GetHOQLQueryPlan(IQueryExpr
ession queryExpression, Boolean shallow, IDictionary2 enabledFilters)
w
NHibernate.lmpl.Abstractsessionimpl.GetHOQLQuerPlan(IQueryBD<pressio
n queryExpression, Eeoolean shallow)
w NHibernate.lmpl.Abstractsessionimpl.CreateQuery(IQueryExpression
queryExpression)
w NHibernate.Linq.DefaultQueryProvider.ExecuteDml[T](QueryMode
queryMode, Expression expression]
w MeraserwHub.NHibernate.UpdateDevice(Device device) w
Ev Kodowanie CHepostMeraserwHubiMeraserwHubiyMeraserwHubiNH
ibernate.cs:wiersz 394

请帮助男人,因为我已经挣扎了一段时间了!

I have a DB handling app in which I came across a problem while updating many to many relation's objects. I have a table Devices and a table Admittances that are connected with one another with a third table Admittances_Devices. Every device can be admitted many times and every admittance can have multiple devices. I put my mappings and classes below

public class Device
    {
        public Device()
        {
            Admittances = new List<Admittance>();
        }
        public virtual int ID { get; set; }
        public virtual string SerialNumber { get; set; }
        public virtual Manufacturer Manufacturer { get; set; }
        public virtual Model Model { get; set; }
        public virtual Volume Volume { get; set; }
        public virtual Type Type { get; set; }
        public virtual string Distinguishing { get; set; }
        public virtual IList<Admittance> Admittances { get; set; }
    }

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MeraserwHub.DBClasses" assembly="MeraserwHub">
    <class name="Device" table="Devices">
        <id name="ID" column="DeviceID" >
            <generator class="identity" />
        </id>
        <property name="SerialNumber" column="SerialNumber" />
        <property name="Distinguishing" column="Distinguishing" />
    
        <many-to-one name="Manufacturer" lazy="proxy" unique="true" column="Manufacturer" not-found="ignore" cascade="all-delete-orphan"/>
        <many-to-one name="Model" lazy="proxy" unique="true" column="Model" not-found="ignore" cascade="all-delete-orphan"/>
        <many-to-one name="Volume" lazy="proxy" unique="true" column="Volume" not-found="ignore" cascade="all-delete-orphan"/>
        <many-to-one name="Type" lazy="proxy" unique="true" column="Type" not-found="ignore" cascade="all-delete-orphan"/>

        <bag name="Admittances" table="Admittances_Devices" inverse ="true" lazy="true" cascade="save-update">
            <key column="DeviceID"/>
            <many-to-many class="Admittance" column="AdmittanceID"/>
        </bag>
    </class>
</hibernate-mapping>

public class Admittance
    {
        public Admittance()
        {
            Devices = new List<Device>();
        }
        public virtual int ID { get; set; }
        public virtual string Number { get; set; }
        public virtual Client Client { get; set; }
        public virtual User User { get; set; }
        public virtual DateTime Date { get; set; }
        public virtual string Notes { get; set; }
        public virtual IList<Device> Devices { get; set; }
    }

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MeraserwHub.DBClasses" assembly="MeraserwHub">
    <class name="Admittance" table="Admittances">
        <id name="ID" column="AdmittanceID" >
            <generator class="native" />
        </id>
        
        <property name="Number" column="Number" />
        <property name="Date" column="Date" />
        <property name="Notes" column="Notes" />
        
        <many-to-one name="User" lazy="proxy" column="[User]" />
        <many-to-one name="Client" lazy="proxy" column="Client" />

        <bag name="Devices" table="Admittances_Devices" cascade="save-update" generic="true">
            <key column="AdmittanceID"/>
            <many-to-many class="Device" column="DeviceID"/>
        </bag>
    </class>
</hibernate-mapping>

When I want to update a device and admittance so I could add a record to each table I get an error. You can find the code of the methods and the error below.

Device device = menu.allDevicesList[cbx_serialNum.SelectedIndex];

device.Admittances.Add(toAddAdmittance); `toAddAdmittance is an object defined earlier`
toAddAdmittance.Devices.Add(device); 
dbConnection.UpdateDevice(device); `dbConnection is NHibernate class object`
dbConnection.UpdateAdmittance(toAddAdmittance);

   public void UpdateDevice(Device device) `the method for admittances looks exactly the same`
        {
            try
            {
                using (mySession.BeginTransaction())
                {
                    mySession.Query<Device>()
                      .Where(a => a.ID == device.ID)
                      .UpdateBuilder()
                      .Set(a => a.SerialNumber, device.SerialNumber)
                      .Set(a => a.Manufacturer, device.Manufacturer)
                      .Set(a => a.Model, device.Model)
                      .Set(a => a.Volume, device.Volume)
                      .Set(a => a.Type, device.Type)
                      .Set(a => a.Distinguishing, device.Distinguishing)
                      .Set(a => a.Admittances, device.Admittances)
                      .Update();

                    mySession.Transaction.Commit();
                }
                //MessageBox.Show("Dane urządzenia zostały zaktualizowane");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Error has an inner exception "MismatchedTreeNodeException(140!=3)" and the stack trace as below. For admittances I get the same error.


w NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
w NHibernate.ql.AsStŁ.ANT LR.Exec.BasicExecutor..ctor(lStatement
statement, IQueryable persister)
w
NHibernate.Hql.Ast.ANTLR.QueryTranslatorlmpl.BuildAppropriatestatem
entExecutor(lStatement statement)
w
NHibernate.Hql.Ast.ANTLR.QueryTranslatorlmpl.DoCompile(lDictionary2
replacements, Boolean shallow, 5tring collectionRolej
w
NHibernate.Hql.AsŁANTLR.ASTQueryTranslatorFactory.CreateQueryTransl
ators(IQueryExpression queryExpression, IASTNode ast, String
queryldentifier, String collectionRole, Boolean shallow, IDictionary2
filters, ISessionFactorylmplementorfactory]
w
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTransl
ators(IQueryExpression queryExpression, String collectionRole, Boolean
shallow, IDictionary2 filters, ISessionFactorylmplementorfactory]
w
NHibernate.Engine.Query,.QueryPlanCache.GetHOQLQueryPlan(IQueryExpr
ession queryExpression, Boolean shallow, IDictionary2 enabledFilters)
w
NHibernate.lmpl.Abstractsessionimpl.GetHOQLQuerPlan(IQueryBD<pressio
n queryExpression, Eeoolean shallow)
w NHibernate.lmpl.Abstractsessionimpl.CreateQuery(IQueryExpression
queryExpression)
w NHibernate.Linq.DefaultQueryProvider.ExecuteDml[T](QueryMode
queryMode, Expression expression]
w MeraserwHub.NHibernate.UpdateDevice(Device device) w
Ev Kodowanie CHepostMeraserwHubiMeraserwHubiyMeraserwHubiNH
ibernate.cs:wiersz 394

Please help guys, cause I've been struggling with this for some time already!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文