nhibernate不匹配的感受
我有一个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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论