2014-12-17 26 views
11

Tôi đã đọc rất nhiều câu hỏi về lỗi tương tự nhưng không có gì kể từ khi khớp với vấn đề chính xác của tôi. Tôi đang cố gắng truy cập vào tài sản của một đối tượng, chính nó là một phần của một đối tượng gốc, sử dụng Fluent NHibernate. Một số câu trả lời nói rằng tôi cần phải sử dụng dự, những người khác mà tôi cần phải sử dụng tham gia, và tôi nghĩ rằng nó nên làm việc thông qua tải lười biếng.Fluent NHibernate "Không thể giải quyết thuộc tính"

Dưới đây là hai lớp học của tôi cùng với các ánh xạ thạo:

lớp Artist

lớp
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); 
    } 
} 

Album

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); 
    } 
} 

Và các lỗi xảy ra khi mã này được giải thích :

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

Lỗi xảy ra khi thành thạo NHibernate cố gắng giải quyết các giá trị x.Artist.Name:

{ "không thể giải quyết bất động sản: Artist.Name của: Album"}

gì sẽ là cách chính xác để làm điều này?

Trả lời

19

Bạn phải nghĩ truy vấn QueryOver của mình dưới dạng (gần) trực tiếp dịch sang SQL. Với suy nghĩ này, hãy tưởng tượng truy vấn SQL này:

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

Điều này sẽ không hoạt động vì bạn không thể truy cập các thuộc tính của bảng có liên quan như trong câu lệnh SQL. Bạn cần phải tạo một tham gia Album-Artistsau đó sử dụng một điều khoản Where:

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

Ngoài ra, kể từ khi bạn đang sử dụng FirstOrDefault, bạn có thể muốn xem xét việc di chuyển logic đến hết cơ sở dữ liệu. Hiện tại, bạn đang kéo lùi mọi bản ghi phù hợp với tiêu chí của mình và sau đó lấy tiêu chí đầu tiên. Bạn có thể sử dụng .Take để giới hạn truy vấn cho 1 kết quả:

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

Điều đó hoạt động hoàn hảo. Cảm ơn bạn đã giải thích lý do đằng sau quá! – Astaar

+0

khám phá tuyệt vời! –

Các vấn đề liên quan