2014-12-17 14 views
11

मैंने उसी त्रुटि के बारे में बहुत से प्रश्न पढ़े हैं लेकिन मेरी सटीक समस्या से मेल खाने के बाद से कोई भी नहीं है। मैं फ्लुएंट एनएचबेर्नेट का उपयोग करके किसी ऑब्जेक्ट की संपत्ति तक पहुंचने की कोशिश कर रहा हूं, जो रूट ऑब्जेक्ट का हिस्सा है। कुछ उत्तरों का कहना है कि मुझे अनुमानों का उपयोग करने की आवश्यकता है, अन्य जिन्हें मुझे शामिल होने की आवश्यकता है, और मुझे लगता है कि इसे आलसी लोडिंग के माध्यम से काम करना चाहिए।फ्लुएंट एनएचबर्ननेट "संपत्ति को हल नहीं कर सका"

यहाँ Fluent मैपिंग के साथ मेरे दो वर्ग हैं:

कलाकार वर्ग

public class Artist 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Album> Albums { get; set; } 
    public virtual string MusicBrainzId { get; set; } 
    public virtual string TheAudioDbId { get; set; } 

    public Artist() { } 
} 

public class ArtistMap : ClassMap<Artist> 
{ 
    public ArtistMap() 
    { 
     LazyLoad(); 
     Id(a => a.Id); 
     Map(a => a.Name).Index("Name"); 
     HasMany(a => a.Albums) 
      .Cascade.All(); 
     Map(a => a.MusicBrainzId); 
     Map(a => a.TheAudioDbId); 
    } 
} 

एल्बम वर्ग

public class Album 
{ 
    public virtual int Id { get; set; } 
    public virtual Artist Artist { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Track> Tracks { get; set; } 
    public virtual DateTime ReleaseDate { get; set; } 
    public virtual string TheAudioDbId { get; set; } 
    public virtual string MusicBrainzId { get; set; } 

    public Album() { } 
} 

public class AlbumMap : ClassMap<Album> 
{ 
    public AlbumMap() 
    { 
     LazyLoad(); 
     Id(a => a.Id); 
     References(a => a.Artist) 
      .Cascade.All(); 
     Map(a => a.Name).Index("Name"); 
     HasMany(a => a.Tracks) 
      .Cascade.All(); 
     Map(a => a.ReleaseDate); 
     Map(a => a.TheAudioDbId); 
     Map(a => a.MusicBrainzId); 
    } 
} 

और त्रुटि होता है जब इस कोड व्याख्या की है :

var riAlbum = session.QueryOver<Album>() 
       .Where(x => x.Name == albumName && x.Artist.Name == artist) 
       .List().FirstOrDefault(); 

त्रुटि होता है जब धाराप्रवाह NHibernate x.Artist.Name मूल्य को हल करने की कोशिश करता है:

{ "संपत्ति हल नहीं कर सका: की Artist.Name: एल्बम"}

क्या ऐसा करने का सही तरीका होगा?

उत्तर

19

आपको अपनी क्वेरी क्वेरी के बारे में सोचना होगा (लगभग) सीधे एसक्यूएल में अनुवाद करना। इस ध्यान में रखते हुए इस SQL ​​क्वेरी की कल्पना:

select 
    Album.* 
from 
    Album 
where 
    Album.Name = 'SomeAlbumName' and 
    Album.Artist.Name = 'SomeArtistName' 

इसका कारण यह है कि आप एक एसक्यूएल बयान में ऐसे ही एक संबंधित तालिका के गुण उपयोग नहीं कर सकते काम नहीं करेगा। आप एक Album से Artist और में शामिल होने तो एक Where खंड का उपयोग बनाने की जरूरत:

var riAlbum = 
    session.QueryOver<Album>() 
       .Where(al => al.Name == albumName) 
      .JoinQueryOver(al => al.Artist) 
       .Where(ar => ar.Name == artistName) 
      .List() 
      .FirstOrDefault(); 

इसके अतिरिक्त, क्योंकि आप FirstOrDefault उपयोग कर रहे हैं, तो आप डेटाबेस समाप्त करने के लिए है कि तर्क ले जाने पर विचार कर सकते हैं। वर्तमान में, आप अपने मानदंड से मेल खाते हुए प्रत्येक रिकॉर्ड को वापस खींच रहे हैं और फिर पहले को ले रहे हैं। क्वेरी को 1 परिणाम तक सीमित करने के लिए आप .Take का उपयोग कर सकते हैं:

var riAlbum = 
    session.QueryOver<Album>() 
       .Where(al => al.Name == albumName) 
      .JoinQueryOver(al => al.Artist) 
       .Where(ar => ar.Name == artistName) 
      .Take(1) 
      .SingleOrDefault<Album>(); 
+0

यह पूरी तरह से काम करता है। पीछे भी कारण बताते हुए धन्यवाद! – Astaar

+0

भयानक स्पष्टीकरण! –

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