2010-12-02 14 views
5

मैं एक विदेशी कुंजी के आधार पर संग्रह को फ़िल्टर करने का प्रयास कर रहा हूं। मैं दो वर्गों जोगलत तालिका उपनाम का उपयोग करके NHibernate

public class GroupPriceOverrideMap:ClassMap<GroupPriceOverride> 
    { 
     public GroupPriceOverrideMap() 
     { 
      CompositeId() 
       .KeyReference(x => x.Service,"ServiceCode") 
       .KeyReference(x => x.CustomerAssetGroup, "GroupID"); 

      Map(x => x.Price); 

      Table("accGroupPriceOverride"); 
     } 
    } 

public class CustomerAssetGroupMap:ClassMap<CustomerAssetGroup> 
    { 
     public CustomerAssetGroupMap() 
     { 
      Id(x => x.GroupID).Unique(); 

      Map(x => x.Description); 

      References(x => x.Customer).Column("CustomerID"); 

      HasMany<GroupPriceOverride>(x => x.PriceOverrides).KeyColumn("GroupID"); 

      Table("accCustAssetGroup"); 
     } 
    } 

साथ मैप की जाती हैं मैं इसे

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup.GroupID == groupID) 

का उपयोग कर क्वेरी हालांकि इस

SELECT this_.ServiceCode as ServiceC1_9_0_, this_.GroupID as GroupID9_0_, this_.Price as Price9_0_ FROM accGroupPriceOverride this_ WHERE customeras1_.GroupID = @p0 
वहाँ

पैदा कर रहा है, जहां खंड एक मेज उर्फ ​​जो मौजूद नहीं है संदर्भित कर रहा है है (customeras1)। यह शायद ग्राहकसेट समूह के साथ पार करने के लिए एक उपनाम है लेकिन उस क्रॉस को करने की कोई आवश्यकता नहीं है। मुझे यकीन है कि यह मेरे मैपिंग में कुछ गलत है लेकिन मुझे यह नहीं मिल रहा है। मैंने दोनों कॉलम में ग्रुपआईडी की मौजूदगी की समस्याएं पैदा करने के मामले में विभिन्न कॉलम नामकरण की कोशिश की है, लेकिन इससे इसे ठीक नहीं किया गया है। कोई विचार?

संपादित मैंने पाया है कि अगर मैं

_session.Linq<CustomerAssetGroup>().Where(x => x.GroupID == groupID).FirstOrDefault().PriceOverrides; 

कर पूछे तो मैं सही परिणाम मिला। मैंने यह भी पाया कि अगर मैंने ग्रुपप्रिस ओवरराइड को सहेजा और फिर एचक्यूएल का उपयोग करके इसके लिए पूछताछ की तो यह नहीं मिलेगा, लेकिन मैं अब भी माता-पिता को लोड करके और ओवरराइड के संग्रह को देखकर इकाई ढूंढ सकता हूं।

_session.CreateQuery("FROM GroupPriceOverride i").List().Count;//returns 0 
_session.CreateQuery("FROM CustomerAssetGroupi").List().FirstOrDefault().PriceOverrides.Count;//returns 1 

उत्तर

1

पुराने LINQ प्रदाता में एक बग की तरह दिखता है। आप एक बग फ़ाइल को यहां किया जा सका:

https://nhibernate.jira.com/secure/Dashboard.jspa

आप के माध्यम से उसके चारों ओर पाने के लिए सक्षम हो सकता है:

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group) 

और NHibernate आईडी यह पता लगाने करते हैं। आप पहले से ही समूह नहीं है, तो आप ऐसा कर सकते हैं:

var group = _session.Load<CustomerAssetGroup>(groupID); 
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group) 

ISession.Load (आईडी) केवल एक प्रॉक्सी उत्पन्न होगा, लेकिन जब तक आप एक संपत्ति का उपयोग वास्तव में डेटाबेस हिट नहीं होगा (जो आप तब से नहीं होंगे जब आप आईडी निर्दिष्ट करने के लिए इसका उपयोग कर रहे हैं)।

+0

धन्यवाद, जेम्स, मैंने अंक प्रदर्शित करने और खोलने के लिए एक यूनिट परीक्षण बनाया है http://216.121.112.228/browse/NHLQ-83 – stimms

+0

बीटीडब्ल्यू - क्या आप NH2.1.2 या NH3 का उपयोग कर रहे हैं? यदि आप NH3 का उपयोग कर रहे हैं, तो ISession.Query (वास्तव में एक एक्सटेंशन विधि) का उपयोग करने के लिए कनवर्ट करने का प्रयास करें। आपकी बग पुरानी LINQ प्रदाता में है, जिसे बहिष्कृत कर दिया गया है। नया LINQ प्रदाता ग्राउंड-अप पुनः लिखना है। –

+0

2.1.2, मुझे यकीन है कि मैं एनएच 3 का उपयोग नहीं कर रहा था, लेकिन शायद यह हो सकता है कि एनपैक में एनएच 3 (आलसी) के लिए एक धाराप्रवाह निबर्ननेट नहीं था। मैं एनएच 3 के खिलाफ धाराप्रवाह पुनर्निर्माण और इसके बजाय इसका उपयोग करने की कोशिश करूंगा। – stimms

संबंधित मुद्दे