作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经阅读了很多关于相同错误的问题,但没有一个与我的确切问题相匹配。我正在尝试使用 Fluent NHibernate 访问一个对象的属性,该对象本身是根对象的一部分。一些答案说我需要使用投影,其他人说我需要使用连接,我认为它应该通过延迟加载来工作。
这是我的两个类以及 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();
错误发生在 Fluent NHibernate 尝试解析 x.Artist.Name 值时:
{"could not resolve property: Artist.Name of: Album"}
这样做的正确方法是什么?
最佳答案
您必须将 QueryOver 查询视为(几乎)直接转换为 SQL。考虑到这一点,想象一下这个 SQL 查询:
select
Album.*
from
Album
where
Album.Name = 'SomeAlbumName' and
Album.Artist.Name = 'SomeArtistName'
这行不通,因为您无法像在 SQL 语句中那样访问相关表的属性。您需要创建一个从 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
,您可能需要考虑将该逻辑移至数据库端。目前,您正在撤回符合条件的每条记录,然后取第一个。您可以使用 .Take
将查询限制为 1 个结果:
var riAlbum =
session.QueryOver<Album>()
.Where(al => al.Name == albumName)
.JoinQueryOver(al => al.Artist)
.Where(ar => ar.Name == artistName)
.Take(1)
.SingleOrDefault<Album>();
关于c# - 流利的 NHibernate "Could not resolve property",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27527409/
我是一名优秀的程序员,十分优秀!