gpt4 book ai didi

c# - 流利的 NHibernate "Could not resolve property"

转载 作者:可可西里 更新时间:2023-11-01 07:51:30 24 4
gpt4 key购买 nike

我已经阅读了很多关于相同错误的问题,但没有一个与我的确切问题相匹配。我正在尝试使用 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 语句中那样访问相关表的属性。您需要创建一个从 AlbumArtist 的连接,然后使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com