2010-03-09 18 views
5

में वैश्विक खोज ऑब्जेक्ट संदर्भ एनएचबीरनेट-प्रबंधित ऑब्जेक्ट्स पर वैश्विक उलटा-खोज करना संभव है?NHibernate

विशेष रूप से, मेरे पास "आईओ" नामक एक सतत कक्षा है। कई तालिकाओं में बड़ी संख्या में फ़ील्ड हैं जो संभावित रूप से उस प्रकार की वस्तु को शामिल कर सकते हैं। ऑब्जेक्ट्स (किसी भी प्रकार के) की एक सूची पुनर्प्राप्त करने के लिए वास्तव में उस विशिष्ट वस्तु का संदर्भ देने के लिए कोई तरीका है (आईओ ऑब्जेक्ट का एक विशिष्ट उदाहरण दिया गया है)? (बोनस पॉइंट्स यदि यह पहचान सकता है कि कौन से विशिष्ट फ़ील्ड में वास्तव में संदर्भ है, लेकिन यह महत्वपूर्ण नहीं है।)

चूंकि एनएचबर्ननेट मैपिंग सभी लिंक को परिभाषित करता है (और अंतर्निहित डेटाबेस के पास विदेशी कुंजी लिंक हैं), होना चाहिए कुछ इसे करने का तरीका।

संरचना इस तरह की कल्पना कीजिए:

class Io 
{ 
    public int Id { get; set; } 
    // other fields specific to the Io type 
} 

class ThingOne 
{ 
    public int Id { get; set; } 
    public Io SensorInput { get; set; } 
    public Io SolenoidOutput { get; set; } 
    // other stuff 
} 

class ThingTwo 
{ 
    public int Id { get; set; } 
    public Io SensorInput1 { get; set; } 
    public Io SensorInput2 { get; set; } 
    public SubThing Doohickey { get; set; } 
    // ... 
} 

class SubThing 
{ 
    public int Id { get; set; } 
    public Io ControlOutput1 { get; set; } 
    // ... 
} 

आईओ का एक विशिष्ट उदाहरण को देखते हुए, मैं खोज के लिए है कि यह आईडी 12. साथ ThingTwo द्वारा संदर्भित है चाहते हैं या यह कि द्वारा और भी साथ ThingOne द्वारा संदर्भित है कि आईडी 16. यदि संभव हो, तो पहला संदर्भ सेंसर इनपुट 2 के माध्यम से है, उदाहरण के लिए।

उत्तर

3

वैसे कॉन्फ़िगरेशन मैपिंग एफके रिलेशनशिप का पर्दाफाश नहीं कर रहे हैं, इसलिए कुछ प्रतिबिंब होने के कारण प्रकार इसका संदर्भ लें। ध्यान दें कि नीचे दिया गया कोड मानता है कि आपके पास एक ही असेंबली में सभी निबर्ननेट-मैप किए गए वर्ग हैं और LINQ समर्थन के लिए सी # 3.0 और ऊपर भी उपयोग करते हैं।

IO toSearch = nhSession.Get<IO>(5); 
var assembly = Assembly.Load("EntityAssembly"); 
IList<Type> assemblyTypes = assembly.GetTypes(); 
var searchType = toSearch.GetType(); 
var typesThatContainedSearchTypeProperty = 
    assemblyTypes.Where(
    ast => ast.GetProperties().Count() > 0 && 
    ast.GetProperties().Where(
     astp => astp.PropertyType != null && astp.PropertyType == searchType).Count() > 0); 

अब अगर आप भी वस्तुओं है कि आईओ के इस विशेष उदाहरण शामिल प्राप्त करना चाहते हैं तो आप एक ही राउंड ट्रिप में यह करने के लिए एक अच्छा MultiCriteria हो सकता है।

var multiCrit = nhSession.CreateMultiCriteria(); 

foreach (var type in typesThatContainedSearchTypeProperty) 
{ 
    //maybe this class has multiple properties of the same Type 
    foreach (PropertyInfo pi in type.GetProperties().Where(astp => astp.PropertyType == toSearch.GetType())) 
     multiCrit.Add(nhSession.CreateCriteria(type).Add(Restrictions.Eq(pi.Name, toSearch))); 
} 
IList results = multiCrit.List(); 

जैसा कि आप अनुमान लगा सकते हैं, क्योंकि हम प्रतिबिंब के साथ शुरू करते हैं, हम केवल प्रतिबिंब के साथ समाप्त कर सकते हैं। परिणाम सूची प्रत्येक मानदंड के परिणामस्वरूप प्रत्येक प्रविष्टि के साथ एक सरणी है, जहां प्रत्येक मानदंड खोज एक परिणाम या परिणामों की एक सूची हो सकती है।

+0

पहले इसने मुझे कुछ परेशानी दी, लेकिन यह मेरे एचबीएम मैपिंग में एक त्रुटि साबित हुई। परिणाम को एक सूची में फटकारने के बाद, यह वही करता है जो मैं बाद में था। धन्यवाद! – Miral

+0

यह बहुत अच्छा है लेकिन किसी को ** toSearch.GetType() ** के बारे में पता होना चाहिए। यह वास्तविक के बजाय प्रॉक्सी ऑब्जेक्ट वापस कर सकता है। –

+0

@ एसएम.एमिन आप लोड() के साथ Get() मिश्रण कर रहे हैं।प्राप्त करें() प्रॉक्सी वापस नहीं करेगा, लोड() – Jaguar

0

क्या आपके "लो" वर्ग में ऑब्जेक्ट (ओं) का संदर्भ नहीं है जिसमें "लो" ऑब्जेक्ट है?

यानी अगर "लो" "हाय" वस्तुओं में से कुछ संख्या से संदर्भ है:

Lo lo = new Lo(); 
List<Hi> hiObjects = lo.hiObjects; 

आप नहीं है, तो:

public class Lo 
{ 
    List<Hi> hiObjects; 
} 

अब अगर आप "लो" का एक उदाहरण है इन प्रकार के संदर्भ, आप उन्हें जोड़ सकते हैं।

+0

केवल अगर एनएचबीर्नेट के लिए उस जानकारी को भरने का कोई तरीका है तो मेरे लिए। यह निश्चित रूप से स्थायी स्थिति में नहीं है - यह ऑब्जेक्ट ग्राफ़ बनाने के हिस्से के रूप में जानकारी पुनर्प्राप्त की गई है। मैंने अपने प्रश्न को एक उदाहरण के साथ विस्तारित किया है जो आशा करता है कि चीजों को बेहतर तरीके से समझाएं। – Miral

+0

इसके अलावा, वर्तमान गिनती पर लगभग 20 विभिन्न प्रकार हैं जिनमें आईओ हो सकता है। तो मैं वास्तव में उन्हें कहीं भी स्पष्ट रूप से सूचीबद्ध नहीं करना चाहता हूं। – Miral