sql – NHibernate – 错误的查询列
我在NHibernate中遇到一个间歇性的问题,它会为一个实体生成一个查询,而是用一个完全不同(和不相关)实体的列替换一个列.
它只会替换单个列,通常通过重新启动应用程序来解决(尽管有时需要几次尝试). > ASP.NET应用程序(.NET 4.0) 对此的任何意见都将不胜感激! 实体 public class LiquiditySourceItem : RunDataEntity,IEntity<int> { public virtual int Id { get; protected internal set; } public virtual int IdentID { get; protected internal set; } public virtual string Portfolio { get; protected internal set; } public virtual string ProfitCentre { get; protected internal set; } public virtual DateTime? MaturityDate { get; protected internal set; } public virtual string Curr1 { get; protected internal set; } public virtual string Curr2 { get; protected internal set; } public virtual decimal Reval { get; protected internal set; } public virtual string ContractType { get; protected internal set; } public virtual string ContractType2 { get; protected internal set; } public virtual string ContractCode { get; protected internal set; } public virtual decimal AmountSignedTradeUnit { get; protected internal set; } public virtual decimal Amount2Signed { get; protected internal set; } public virtual decimal SpotDelta { get; protected internal set; } public virtual string TradeRevalCurr { get; protected internal set; } } 实体映射 public LiquiditySourceItemMap() { Id(x => x.Id,map => map.Column("RowId")); Property(x => x.IdentID,map => map.Column("IdentID")); Property(x => x.Portfolio,map => map.Column("Portfolio")); Property(x => x.ProfitCentre,map => map.Column("ProfitCentre")); Property(x => x.MaturityDate,map => map.Column("Con_Expiry")); Property(x => x.BuySell,map => map.Column("BS")); Property(x => x.Curr1,map => map.Column("Curr1")); Property(x => x.Curr2,map => map.Column("Curr2")); Property(x => x.Reval,map => map.Column("Reval")); Property(x => x.ContractType,map => map.Column("ContractType")); Property(x => x.ContractType2,map => map.Column("ContractType2")); Property(x => x.ContractCode,map => map.Column("ContractCode")); Property(x => x.AmountSignedTradeUnit,map => map.Column("AmountSignedTradeUnit")); Property(x => x.Amount2Signed,map => map.Column("Amount2Signed")); Property(x => x.ValSpot,map => map.Column("Val_Spot")); Property(x => x.SpotDelta,map => map.Column("SpotDelta")); Property(x => x.TradeRevalCurr,map => map.Column("Traderevalcurr")); Property(x => x.SourceReport,map => map.Column("SourceReport")); ManyToOne(x => x.RunContext,map => map.Column("RunContextID")); Table("Staging.vw_Liquidity"); } 报告实体 public class BusinessBreakdownStandardPosition : ReportRunDataEntity,IEntity<long> { public virtual long Id { get; set; } public virtual decimal FinalNettingAmountUSD { get; set; } public virtual decimal InitialChargeAmountUSD { get; set; } public virtual BusinessBreakdownInitialPrr InitialPrr { get; set; } public virtual IEnumerable<FinalInstrumentPosition> FinalInstrumentPositions { get; set; } public virtual decimal CreditEventPaymentUSD { get; set; } public virtual decimal ValuationChangeIncreaseUSD { get; set; } public virtual decimal ValuationChangeDecreaseUSD { get; set; } public virtual string ReportKey { get; set; } public virtual decimal USDCharge { get; set; } public virtual decimal USDChargeICG { get; set; } public virtual string InstrumentType { get; set; } } 报告实体映射 public class BusinessBreakdownStandardPositionMap : ClassMapping<BusinessBreakdownStandardPosition> { public BusinessBreakdownStandardPositionMap() { Id(x => x.Id,m => { m.Column("BusinessBreakdownStandardPositionID"); m.Generator(Generators.HighLow,g => g.Params( new { table = "dbo.HiValue",max_lo = 10000,Where = string.Format("EntityName = 'BusinessBreakdownStandardPosition'") })); }); Property(x => x.FinalNettingAmountUSD,map => map.Column("FinalNettingAmountUSD")); Property(x => x.InitialChargeAmountUSD,map => map.Column("InitialAmountUSD")); Property(x => x.CreditEventPaymentUSD); Property(x => x.ValuationChangeDecreaseUSD); Property(x => x.ValuationChangeIncreaseUSD); Property(x => x.USDCharge); Property(x => x.USDChargeICG); Property(x=>x.InstrumentType); ManyToOne(p => p.RunContext,map => map.Column("ReportRunContextID")); ManyToOne(p => p.InitialPrr,m => { m.Column("InitialPrrID"); m.Cascade(Cascade.All); }); Property(x => x.ReportKey); Bag(x => x.FinalInstrumentPositions,collectionMapping => { collectionMapping.Table("Reporting.BusinessBreakdownFinalInstrumentPositionStandardPositionMap"); collectionMapping.Cascade(Cascade.All); collectionMapping.Key(k => k.Column("StandardPositionID")); },mapping => mapping.ManyToMany(y => y.Column("FinalInstrumentPositionID"))); Table("Reporting.BusinessBreakdownStandardPosition"); } } SQL查询,由NHibernate生成 SELECT this_.RowId AS RowId47_0_,this_.IdentID AS IdentID47_0_,this_.Portfolio AS Portfolio47_0_,this_.ProfitCentre AS ProfitCe4_47_0_,this_.Con_Expiry AS Con5_47_0_,this_.BS AS BS47_0_,this_.Curr1 AS Curr7_47_0_,this_.Curr2 AS Curr8_47_0_,this_.Reval AS Reval47_0_,this_.ContractType AS Contrac10_47_0_,this_.ContractType2 AS Contrac11_47_0_,this_.ContractCode AS Contrac12_47_0_,this_.AmountSignedTradeUnit AS AmountS13_47_0_,this_.Amount2Signed AS Amount14_47_0_,this_.Val_Spot AS Val15_47_0_,this_.SpotDelta AS SpotDelta47_0_,this_.InitialAmountUSD AS Initial17_47_0_,this_.RunContextID AS RunCont18_47_0_,this_.SourceReport AS Sou19_47_0_ FROM Staging.vw_Liquidity this_ 例外 System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'InitialAmountUSD'. 你可以看到,nhibernate已经用“InitialAmountUSD”替换了LiquiditySourceItem列“Traderevalcurr”,它属于BusinessBreakdownStandardPosition实体.这些实体没有任何关系.否则,SQL完全符合您的期望(包括列顺序). 意见 >错误的列始终是不同映射实体中的有效列 有什么想法吗? 解决方法我在NHibernate Users Google Groups论坛上提出了同样的问题,有人认为他们已经制定了根本原因(并提出了一个解决方案):https://groups.google.com/forum/#!topic/nhusers/BZoBoyWQEvs
如果你想修复这个错误,你可以修补NH源代码:
有关问题的详细信息,请查看Google群组. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |