Thanks for your work on this. A 3.3.4 release with the fix will be available shortly. Please report back with the results.
/Oskar 2014-07-15 20:05 GMT+02:00 Shawn Gresham <[email protected]>: > I can see that. I would definitely want someone to fix it who has a > firmer understanding of how changing this class would impact NH's handling > of compositing and polymorphism. > > I couldn't find any outstanding bugs that appear to fit the description of > what we are seeing, so I created a new one: > > https://nhibernate.jira.com/browse/NH-3638 > > > > On Tue, Jul 15, 2014 at 9:15 AM, Oskar Berggren <[email protected]> > wrote: > >> Nice work! I don't have access to the code at the moment, but it must be >> decided if PropertyPath should have reference equality or by-value >> equality. Based on your excerpt, the current code seems to use reference >> equality (but in a broken way), while your proposed change makes it neither >> (since it compares both the value and the reference based hashcode, it's a >> mix of semantics). >> >> Please have a search in JIRA to see if you find something that looks >> similar. >> >> /Oskar >> Den 15 jul 2014 02:01 skrev "Shawn Gresham" <[email protected]>: >> >>> I found the bug. Now I just need to figure out the where/who/how to >>> get it fixed. Did anyone here create a bug on JIRA for this issue? >>> >>> For anyone interested in the details, the problem code is in >>> PropertyPath.Equals(PropertyPath) which attempts to determine equality by >>> only using the hash code. This works fine for smaller code bases as the >>> default Object.GetHashCode() returns a sequential object index. However, >>> after garbage collection, these indices get reused as finalized objects are >>> removed and new objects are created (see documentation on GetHashCodeEx for >>> details) which results in more than one object getting the same hashcode. >>> >>> This causes our problem because PropertyPath is used as a key for the >>> dictionary that holds the property customizers (.Column(), .Length(), etc.) >>> for each property in the mapping. Once garbage collection kicks in, >>> property paths have a chance to share the same hashcode which means they >>> will ultimately mix up their customizers for the colliding properties, thus >>> the wrong column names. >>> >>> Likely the reason why this problem was more prevalent in ASP.NET is >>> because of the sheer object count added by the ASP.NET library and the >>> way it handles garbage collection. >>> >>> If you have your own copy of the NH source, you can fix the bug by >>> changing NHibernate/Mapping/ByCode/PropertyPath.cs line #66 from: >>> >>> return hashCode == other.GetHashCode(); >>> >>> To: >>> >>> return hashCode == other.GetHashCode() && ToString() == other.ToString >>> (); >>> >>> Shawn >>> >>> On Saturday, July 12, 2014 5:10:29 AM UTC-5, Oskar Berggren wrote: >>>> >>>> Keep up the good work Shawn! The asp.net environment is definitely >>>> more susceptible to race conditions than a simple console app. >>>> >>>> /Oskar >>>> Den 12 jul 2014 04:35 skrev "Shawn Gresham" <[email protected]>: >>>> >>>>> I was actually able to make some good progress on this today. I have >>>>> a test environment that can consistently reproduce the problem. >>>>> >>>>> A year or so ago, I had created a simple console application that >>>>> built up a mapping and compared it against a baseline list of columns to >>>>> attempt to detect incorrect column names. I then created a testing >>>>> framework that would run this application repeatedly and logged the >>>>> results. After a weekend of continuous runs, I got nothing. >>>>> >>>>> After reading the posts here, I rebuilt the framework replacing the >>>>> console application with a ASP.NET web service that configured the >>>>> mappings in Application_Start and did the comparison against the baseline >>>>> there. With this setup, I got a failure within the first 40 iterations >>>>> and >>>>> probably had 5 or 6 by the time I hit 100 iterations. I modified the >>>>> testing framework to perform a minidump on IIS after detecting a failure >>>>> and was able to determine via WinDbg that the column name error can be >>>>> tracked all the way back to the HbmProperty definition. >>>>> >>>>> My next step is to boil all of this down into something I can post to >>>>> the NH bug list and hope they take a look at it. >>>>> >>>>> On Friday, July 11, 2014 3:21:13 PM UTC-5, Shawn Gresham wrote: >>>>>> >>>>>> We've been running into this for while now (a couple of years at >>>>>> least) in our production web garden. The problem seemed to appear more >>>>>> often as we slowly switched our codebase over from XML to Mapping-By-Code >>>>>> so I am guessing it is probably some sort of race condition in that >>>>>> logic. >>>>>> The production server is also pretty weak, so I am fairly certain that >>>>>> system stress does play a part in it. We've had it appear on our >>>>>> development workstations probably 3 or 4 times only. >>>>>> >>>>>> The last time it occured it was a mapping that had Column() >>>>>> specification, so that does not appear to resolve our issue here. In >>>>>> fact, >>>>>> most of our column names are specified due to poor column naming on our >>>>>> legacy databases. >>>>>> >>>>>> I've been capturing mini-dumps of the corrupt sessions and looking >>>>>> over them with windbg. I've found SingleTableEntityPersister's with the >>>>>> incorrect column so I know it goes back that far. I can't seem to catch >>>>>> one before the HbmMappings get garbage collected. :( >>>>>> >>>>>> On Tuesday, July 1, 2014 5:20:46 AM UTC-5, Tom wrote: >>>>>> >>>>>> Hi vitalya, >>>>>> >>>>>> Unfortunately not. We added explicit column names to the mappings and >>>>>> the problem seems to have been resolved - since doing that about 6 weeks >>>>>> ago, we've not since had this issue (though I'm not convinced that's >>>>>> actually solved the issue, and it's certainly not a permanent solution). >>>>>> >>>>>> For reference, we mainly get it on our DEV environments, and >>>>>> occasionally UAT and production environments too. Our dev servers (where >>>>>> the issue occurs the vast majority of times), is a reasonably powerful >>>>>> continuous integration server (using TeamCity), but the it's shared >>>>>> between >>>>>> multiple projects, running multiple builds, and also all dev & uat >>>>>> environments sit here too, so there may not always be that much >>>>>> resources >>>>>> available for each build. >>>>>> >>>>>> Thanks, >>>>>> Tom >>>>>> >>>>>> On Friday, 27 June 2014 08:47:24 UTC+1, vitalya wrote: >>>>>> >>>>>> Hello Tom, >>>>>> >>>>>> We've beend experiencing this issue mostly on test environments. >>>>>> After several rounds of investigation we did not find what is causing it. >>>>>> For now we're suspecting that bug is reproduced on servers with low >>>>>> performance and is somehow related to concurency. Have you managed to >>>>>> solve >>>>>> this problem? >>>>>> >>>>>> On Thursday, January 30, 2014 5:01:19 PM UTC+2, Tom wrote: >>>>>> >>>>>> Sure, here's the SessionFactory: >>>>>> >>>>>> configuration.DataBaseIntegration(dbi => >>>>>> { >>>>>> dbi.Dialect<MsSql2008Dialect>(); >>>>>> dbi.Driver<SqlClientDriver>(); >>>>>> dbi.ConnectionProvider<DriverConnectionProvider>(); >>>>>> dbi.IsolationLevel = IsolationLevel.ReadCommitted; >>>>>> dbi.BatchSize = 200; >>>>>> dbi.Timeout = 255; >>>>>> dbi.LogFormattedSql = true; >>>>>> dbi.ConnectionString = configurationService.ConnectionString; >>>>>> dbi.OrderInserts = false; >>>>>> }); >>>>>> configuration.Cache(x => x.UseQueryCache = true); >>>>>> configuration.SessionFactory().Caching.Through<SysCacheProvider>(). >>>>>> WithDefaultExpiration(60); >>>>>> var mapperserialized = mapperFactory.Create().Compile >>>>>> MappingForAllExplicitlyAddedEntities(); >>>>>> configuration.AddDeserializedMapping(mapperserialized, "NhibConfig"); >>>>>> >>>>>> foreach (string assemblyName in GetUniqueAssemblyNames(assembl >>>>>> yNames)) >>>>>> { >>>>>> configuration.AddAssembly(assemblyName); >>>>>> } >>>>>> >>>>>> configuration.BuildSessionFactory(); >>>>>> >>>>>> >>>>>> In terms of XML, 'Property(x => x.USDCharge);' translates to >>>>>> '<property name="ReportKey" />', which is as I'd expect. >>>>>> >>>>>> As you said, I don't usually specify a column name in the mapping >>>>>> file unless it's different from the property, but as I mentioned before, >>>>>> doing so for this entity seems to resolve the problem with the incorrect >>>>>> column.I'd still like to get to the bottom of the issue though, as I've >>>>>> seen the same problem ocurr for different entities, both of which contain >>>>>> explicitt column name mappings. >>>>>> >>>>>> No, we don't share mappings between entities and no entities have >>>>>> multiple mappings. The only slightly unusual thing is that most/all >>>>>> entities extend a base class, and these base properties are mapped by >>>>>> each >>>>>> derived classes' mapping files. Other than that, can't see anything else >>>>>> out of the ordinary with our set-up! >>>>>> >>>>>> >>>>>> On Thursday, 30 January 2014 14:29:21 UTC, Rippo wrote: >>>>>> >>>>>> “This suggests to me that NHibernate isn't actually using these >>>>>> generated files to perform the db/entity mapping, rather it's doing it >>>>>> programmatically” >>>>>> >>>>>> >>>>>> >>>>>> The XML or (mapping-by-code that is injected) is used by the session >>>>>> factory upon creation… >>>>>> >>>>>> >>>>>> >>>>>> Can you post the code the builds the sessionfactory? >>>>>> >>>>>> >>>>>> >>>>>> Also what does this 'Property(x => x.USDCharge);’ translate to in >>>>>> XML terms? That is when you write out XML what is shown for this >>>>>> property? >>>>>> >>>>>> >>>>>> >>>>>> I must admit I have used NH for many years and have never seen this >>>>>> behaviour, but it does seem odd to be sure…. I am sure if this was a bug >>>>>> then it would have been picked up before. Do you share multiple entities >>>>>> with same mapping file or vice versa? >>>>>> >>>>>> >>>>>> >>>>>> In my case (note I never use map.Column unless the column names are >>>>>> not the same):- >>>>>> >>>>>> >>>>>> >>>>>> Property(x => x.NewsDate, x => x.NotNullable(true)); >>>>>> >>>>>> Translates to >>>>>> >>>>>> <property name="NewsDate" not-null="true" /> >>>>>> >>>>>> >>>>>> >>>>>> And this >>>>>> >>>>>> Property(x => x.NewsDate); >>>>>> >>>>>> Translates to >>>>>> >>>>>> <property name="NewsDate" /> >>>>>> >>>>>> >>>>>> >>>>>> Both these XML representations are fine, I prefer the first one as I >>>>>> tend not to use nulls. >>>>>> >>>>>> >>>>>> >>>>>> *From:* [email protected] [mailto:[email protected]] *On >>>>>> Behalf Of *Tom >>>>>> *Sent:* 30 January 2014 13:38 >>>>>> *To:* [email protected] >>>>>> *Subject:* [nhusers] Re: NHibernate - Wrong Columns on Queries >>>>>> >>>>>> >>>>>> >>>>>> Yes, it fails on both DEV and PROD servers. >>>>>> >>>>>> I've tried generating the .hbm.xml mapping files and have compared >>>>>> those from a sucessful run and those when it's thrown this exception. >>>>>> However, both sets of mappings appear fine, and they're completely >>>>>> identical.This suggests to me that NHibernate isn't actually using >>>>>> these generated files to perform the db/entity mapping, rather it's doing >>>>>> it programatically >>>>>> >>>>>> The problem is that it's such an intermittant bug. I've just tried >>>>>> running the code over 20 times on the DEV server, but it only failed >>>>>> once. >>>>>> Currently, can't figure out a way to consistently repicatle the issue, >>>>>> which is making it very hard to debug! >>>>>> >>>>>> I believe though that the issue may have something to do with missing >>>>>> the column names on the mapping classes. It seems that explicitly adding >>>>>> these columns tends to prevent the error from ocurring, i.e. changing >>>>>> 'Property(x >>>>>> => x.USDCharge);' to 'Property(x => x.USDCharge, map => >>>>>> map.Column("USDCharge"));' >>>>>> >>>>>> Any thoughts on why this may be the case? >>>>>> >>>>>> >>>>>> On Thursday, 30 January 2014 09:52:17 UTC, Tom wrote: >>>>>> >>>>>> >>>>>> >>>>>> I'm getting an intermittant problem with NHibernate where it >>>>>> generates a query for an entity, but replaces one of the columns with a >>>>>> column from completely different (and unrelated) entity. >>>>>> >>>>>> It only ever replaces a single column, and is generally solved by >>>>>> restarting the application (though sometimes it takes a couple of >>>>>> attempts). >>>>>> >>>>>> - ASP.NET application (.NET 4.0) >>>>>> - SessionFactory created during Application_Start >>>>>> - NHibernate 3.3.1- All mappings/configuration done via Mapping >>>>>> By Code >>>>>> - Using Nhibernate Criteria >>>>>> >>>>>> Any input on this would be much appreciated! >>>>>> >>>>>> *Entity* >>>>>> >>>>>> 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; } >>>>>> >>>>>> } >>>>>> >>>>>> *Entity Mapping* >>>>>> >>>>>> 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"); >>>>>> >>>>>> } >>>>>> >>>>>> *Report Entity* >>>>>> >>>>>> 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; } >>>>>> >>>>>> } >>>>>> >>>>>> *Report Entity Mapping* >>>>>> >>>>>> 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 Query, Generated By 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_ >>>>>> >>>>>> *Exception* >>>>>> >>>>>> System.Data.SqlClient.SqlException (0x80131904): Invalid column name >>>>>> 'InitialAmountUSD'. >>>>>> >>>>>> As you can see, nhibernate has replaced the LiquiditySourceItem >>>>>> column 'Traderevalcurr' with 'InitialAmountUSD', which belongs to the >>>>>> BusinessBreakdownStandardPosition entity. These entities have no >>>>>> relationship whatsoever. Otherwise, the SQL is exactly as you'd expect( >>>>>> including column order). >>>>>> >>>>>> *Observations* >>>>>> >>>>>> - The wrong column is always a valid column in a different mapped >>>>>> entity >>>>>> - The wrong column will replace an existing one >>>>>> - The order of columns remains intact >>>>>> - Everything else with the SQL query is otherwise correct >>>>>> - The issue sometimes ocurrs between other entities. Again, >>>>>> there's no relationship between these >>>>>> >>>>>> Any thoughts? >>>>>> >>>>>> http://stackoverflow.com/questions/21382756/nhibernate-wrong >>>>>> -columns-on-queries >>>>>> >>>>>> http://stackoverflow.com/questions/16991838/nhibernate-gener >>>>>> ating-wrong-columns-on-queries >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "nhusers" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> To post to this group, send email to [email protected]. >>>>>> Visit this group at http://groups.google.com/group/nhusers. >>>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>>> >>>>>> >>>>>> On Thursday, 30 January 2014 14:29:21 UTC, Rippo wrote: >>>>>> >>>>>> “This suggests to me that NHibernate isn't actually using these >>>>>> generated files to perform the db/entity mapping, rather it's doing it >>>>>> programmatically” >>>>>> >>>>>> >>>>>> >>>>>> The XML or (mapping-by-code that is injected) is used by the session >>>>>> factory upon creation… >>>>>> >>>>>> >>>>>> >>>>>> Can you post the code the builds the sessionfactory? >>>>>> >>>>>> >>>>>> >>>>>> Also what does this 'Property(x => x.USDCharge);’ translate to in >>>>>> XML terms? That is when you write out XML what is shown for this >>>>>> property? >>>>>> >>>>>> >>>>>> >>>>>> I must admit I have used NH for many years and have never seen this >>>>>> behaviour, but it does seem odd to be sure…. I am sure if this was a bug >>>>>> then it would have been picked up before. Do you share multiple entities >>>>>> with same mapping file or vice versa? >>>>>> >>>>>> >>>>>> >>>>>> In my case (note I never use map.Column unless the column names are >>>>>> not the same):- >>>>>> >>>>>> >>>>>> >>>>>> Property(x => x.NewsDate, x => x.NotNullable(true)); >>>>>> >>>>>> Translates to >>>>>> >>>>>> <property name="NewsDate" not-null="true" /> >>>>>> >>>>>> >>>>>> >>>>>> And this >>>>>> >>>>>> Property(x => x.NewsDate); >>>>>> >>>>>> Translates to >>>>>> >>>>>> <property name="NewsDate" /> >>>>>> >>>>>> >>>>>> >>>>>> Both these XML representations are fine, I prefer the first one as I >>>>>> tend not to use nulls. >>>>>> >>>>>> >>>>>> >>>>>> *From:* [email protected] [mailto:[email protected]] *On >>>>>> Behalf Of *Tom >>>>>> *Sent:* 30 January 2014 13:38 >>>>>> *To:* [email protected] >>>>>> *Subject:* [nhusers] Re: NHibernate - Wrong Columns on Queries >>>>>> >>>>>> >>>>>> >>>>>> Yes, it fails on both DEV and PROD servers. >>>>>> >>>>>> I've tried generating the .hbm.xml mapping files and have compared >>>>>> those from a sucessful run and those when it's thrown this exception. >>>>>> However, both sets of mappings appear fine, and they're completely >>>>>> identical.This suggests to me that NHibernate isn't actually using >>>>>> these generated files to perform the db/entity mapping, rather it's doing >>>>>> it programatically >>>>>> >>>>>> The problem is that it's such an intermittant bug. I've just tried >>>>>> running the code over 20 times on the DEV server, but it only failed >>>>>> once. >>>>>> Currently, can't figure out a way to consistently repicatle the issue, >>>>>> which is making it very hard to debug! >>>>>> >>>>>> I believe though that the issue may have something to do with missing >>>>>> the column names on the mapping classes. It seems that explicitly adding >>>>>> these columns tends to prevent the error from ocurring, i.e. changing >>>>>> 'Property(x >>>>>> => x.USDCharge);' to 'Property(x => x.USDCharge, map => >>>>>> map.Column("USDCharge"));' >>>>>> >>>>>> Any thoughts on why this may be the case? >>>>>> >>>>>> >>>>>> On Thursday, 30 January 2014 09:52:17 UTC, Tom wrote: >>>>>> >>>>>> >>>>>> >>>>>> I'm getting an intermittant problem with NHibernate where it >>>>>> generates a query for an entity, but replaces one of the columns with a >>>>>> column from completely different (and unrelated) entity. >>>>>> >>>>>> It only ever replaces a single column, and is generally solved by >>>>>> restarting the application (though sometimes it takes a couple of >>>>>> attempts). >>>>>> >>>>>> - ASP.NET application (.NET 4.0) >>>>>> - SessionFactory created during Application_Start >>>>>> - NHibernate 3.3.1- All mappings/configuration done via Mapping >>>>>> By Code >>>>>> - Using Nhibernate Criteria >>>>>> >>>>>> Any input on this would be much appreciated! >>>>>> >>>>>> *Entity* >>>>>> >>>>>> 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; } >>>>>> >>>>>> } >>>>>> >>>>>> *Entity Mapping* >>>>>> >>>>>> public LiquiditySourceItemMap() >>>>>> >>>>>> { >>>>>> >>>>>> Id(x => x.Id, map => map.Column("RowId")); >>>>>> >>>>>> Property(x => x.IdentID, map => map.Column("IdentID")); >>>>>> >>>>>> <c >>>>>> >>>>>> ... >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "nhusers" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To post to this group, send email to [email protected]. >>>>> Visit this group at http://groups.google.com/group/nhusers. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "nhusers" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/nhusers. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "nhusers" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/nhusers/BZoBoyWQEvs/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/nhusers. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/nhusers. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/d/optout.
