FluentNHibernate“Unabletoresolvepropertyproblem”.我正在尝试使用FluentNHibernate访问对象的属性,该对象本身是根对象的一部分。一些答案说我需要使用投影,其他我需要使用连接,我认为它应该通过延迟加载。这是我的两个类以及Fluent投影:美术家类publicclassArtist{publicvirtualintId{get;放;}publicvirtualstringName{get;放;}publicvirtualIListAlbums{get;放;}publicvirtualstringMusicBrainzId{get;放;}publicvirtualstringTheAudioDbId{get;放;}publicArtist(){}}publicclassArtistMap:ClassMap{publicArtistMap(){LazyLoad();Id(a=>a.Id);Map(a=>a.Name).Index("名称");HasMany(a=>a.Albums).Cascade.All();地图(a=>a.MusicBrainzId);映射(a=>a.TheAudioDbId);}}专辑类publicclassAlbum{publicvirtualintId{get;放;}publicvirtualArtistArtist{get;放;}publicvirtualstringName{get;放;}publicvirtualIListTracks{get;放;}publicvirtualDateTimeReleaseDate{get;放;}publicvirtualstringTheAudioDbId{get;放;}publicvirtualstringMusicBrainzId{get;放;}publicAlbum(){}}publicclassAlbumMap:ClassMap{publicAlbumMap(){LazyLoad();身份证(一个=>一个。ID);引用(a=>a.Artist).Cascade.All();Map(a=>a.Name).Index("名称");HasMany(a=>a.Tracks).Cascade.All();地图(a=>a.ReleaseDate);映射(a=>a.TheAudioDbId);地图(a=>a.MusicBrainzId);}}解释这段代码时发生错误:varriAlbum=session.QueryOver().Where(x=>x.Name==albumName&&x.Artist.Name==artist).List().FirstOrDefault();当FluentNHibernate尝试解析x.Artist.Name值时发生错误:{"无法解析属性:Artist.Nameof:Album"}执行此操作的正确方法是什么?您必须将QueryOver查询视为(几乎)直接转换为SQL考虑到这一点,想象一下这个SQL查询:selectAlbum.*fromAlbumwhereAlbum.Name='SomeAlbumName'andAlbum.Artist.Name='SomeArtistName'this不起作用,因为您无法在SQL语句中访问相关表的属性。您需要从专辑创建到艺术家,然后使用Where子句:varriAlbum=session.QueryOver().Where(al=>al.Name==albumName).JoinQueryOver(al=>al.Artist).Where(ar=>ar.Name==artistName).List().FirstOrDefault();此外,由于您使用的是FirstOrDefault,您可能需要考虑将该逻辑移至数据库端。目前,您正在提取符合条件的每条记录,然后选择第一条记录。您可以使用.Take将查询限制为1个结果:varriAlbum=session.QueryOver().Where(al=>al.Name==albumName).JoinQueryOver(al=>al.Artist).Where(ar=>ar.Name==artistName).Take(1).SingleOrDefault();另一种解释是您在NHibernateClassMapping定义中缺少此属性或字段的映射。我来到这里,为什么我会根据以下情况收到此错误。varquery=scheduleRepository.CurrentSession().Query().Where(x=>x.ScheduleInfo.StartDate.Date这给了我一个CannotresolvepropertyofStartDate错误。这很让人头疼,因为我一直在使用这种语法。我的映射文件看起来像这样:publicclassScheduleInfoMapping:NHibernateClassMapping{publicSc??heduleInfoMapping(){DiscriminateSubClassesOnColumn("Type");Map(x=>x.Detail).MapAsLongText();}}MissingStartDate.变成:publicclassScheduleInfoMapping:NHibernateClassMapping{publicScheduleInfoMapping(){DiscriminateSubClassesOnColumn("Type");Map(x=>x.Detail).MapAsLongText();Map(x=>x.StartDate);}}这解决了这个错误。以上就是C#学习教程:FluentNHibernate《无法解决属性问题》分享的全部内容。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
