0

我正在使用视图 vw_SearchSite 实现全文搜索,该视图具有所有可搜索字段并返回具有与搜索结果相同的站点 ID 的站点。

查询:

......

<return alias="site" class="Site"/>

SELECT DISTINCT {site.*}
FROM v_Site {site}
WHERE {site}.Id IN (
  SELECT Id
  FROM vw_SearchSite
  WHERE CONTAINS(vw_SearchSite.*,:pattern)
)

实施:

 public Site[] GetSitesforSearch(string search)
    {
        using (var session = GetSession())
        {

            var q1 = session.GetNamedQuery("SearchSite").SetString("pattern", search);
            var q2 = q1.List<Site>().ToArray();
            return q2;
        }
    }

我对它进行单元测试时的异常:

in expected: {site} [SELECT DISTINCT {site.*}
FROM v_Site {site}
WHERE {site}.Id IN (
  SELECT Id
  FROM vw_SearchSite
  WHERE CONTAINS(vw_SearchSite.*,:pattern)
)]

我对 localhost 数据库拥有完全权限。我尝试了所有可以使用上述代码的排列和组合,但未能找到出路。当我在 SQL SERVER 管理工作室中执行查询时,它工作得非常好。

这是我的单元测试:

public void Getsitesforsearch_returns_all_matching_sites_test() { //排列 const string search = "abc"; var country = _entityBuilder.CreateCountry(); country.Name = "墙国"; var country1 = _entityBuilder.CreateCountry(); country.Name = "糟糕的国家"; var state1 = _entityBuilder.CreateState(); state1.Country = 国家;var state2 = _entityBuilder.CreateState(); state2.Country = 国家 1;state1.Name = "墙状态"; state1.Abbreviation = "WS"; state2.Name = "废话"; state2.Abbreviation = "CR";

        var site1 = _entityBuilder.CreateSite();
        var site2 = _entityBuilder.CreateSite();
        var site3 = _entityBuilder.CreateSite();
        var site4 = _entityBuilder.CreateSite();

        site1.Name = "abc";
        site1.City = "wallsite";
        site1.PostalCode = "33333";
        site1.State = state2;

        site2.State = state2;
        site2.City = "wallsite";
        site2.PostalCode = "44444";
        site2.Name = "site wall";

        site3.State = state1;
        site3.City = "wallsite";
        site3.PostalCode = "55555";
        site3.Name = "site";

        site4.City = "walstreet";
        site4.PostalCode = "66666";
        site4.Name = "site wall";
        site4.State = state2;

        PersistEntities(state1, state2, country1,country);
        PersistEntities(site1,site2,site3,site4);
        var sites = new[] {site2,site3,site4};

        //Act
        var repository = CreateRepository();
        var result = repository.GetSitesforSearch(search);

        //Assert
        result.ShouldNotContain(site1);
        result.ShouldEqual(sites) ;
        result.ShouldContain(site2);
        result.ShouldContain(site3);
        result.ShouldContain(site4);

    }

这是错误:

SiteRepositoryTester.Getsitesforsearch_returns_all_matching_sites_test:失败

SecondaryGroupName 作为 Secondar9_10_,site0_.StateId 作为 StateId10_ from tg.v_Site site0_ NHibernate:从 tg.v_Device 中选择 device0_.Id 作为 Id7_,device0_.DeviceTypeId 作为 DeviceTy2_7_,device0_.Name 作为 Name7_,device0_.NodeId 作为 NodeId7_,device0_.SiteId 作为 SiteId7_ device0_NHibernate:从 tg.vw_BaseConnection 中选择 connection0_.ConnectionId 作为 Connecti1_6_,connection0_.RemoteIP 作为 RemoteIP6_,connected0_.ConnectedOn 作为 Connecte3_6_,connection0_.DisconnectedOn 作为 Disconne4_6_,connection0_.BaseStationId 作为 BaseStat5_6_ 从 tg.vw_BaseConnection connection0_NHibernate:选择 country0_.Id 作为 Id1_,country0_.Name作为来自 tg.vw_Country country0_ NHibernate 的 Name1_:INSERT INTO tg.vw_Country (Name) VALUES (@p0); 选择 SCOPE_IDENTITY(); @p0 = 'United States' NHibernate: INSERT INTO tg.vw_State (Name, Abbreviation, CountryId) VALUES (@p0, @p1, @p2); 选择 SCOPE_IDENTITY(); @p0 = 'Minnesota', @p1 = 'MN', @p2 = '347' NHibernate: NHibernate: INSERT INTO tg.vw_Country (Name) VALUES (@p0); 选择 SCOPE_IDENTITY(); @p0 = 'United States' NHibernate: INSERT INTO tg.vw_State (Name, Abbreviation, CountryId) VALUES (@p0, @p1, @p2); 选择 SCOPE_IDENTITY(); @p0 = 'Minnesota', @p1 = 'MN', @p2 = '348' NHibernate: NHibernate: INSERT INTO tg.vw_Country (Name) VALUES (@p0); 选择 SCOPE_IDENTITY(); @p0 = 'United States' NHibernate: INSERT INTO tg.vw_Country (Name) VALUES (@p0); 选择 SCOPE_IDENTITY(); @p0 = 'crappy country' NHibernate: NHibernate: INSERT INTO tg.v_Site (Name, Address, City, PostalCode, Latitude, Longitude, PrimaryGroupName, SecondaryGroupName, StateId) VALUES (@p0, @p1, @p2, @p3, @ p4,@p5,@p6,@p7,@p8);选择 SCOPE_IDENTITY(); @p0 = 'abc',@p1 = '12343 测试大道',@p2 = 'wallsite',@p3 = '33333',@p4 = '55',@p5 = '-92.2',@p6 = 'Pri ', @p7 = 'Sec', @p8 = '181' NHibernate: INSERT INTO tg.v_Site (Name, Address, City, PostalCode, Latitude, Longitude, PrimaryGroupName, SecondaryGroupName, StateId) VALUES (@p0, @p1, @ p2、@p3、@p4、@p5、@p6、@p7、@p8);选择 SCOPE_IDENTITY(); @p0 = '站点墙',@p1 = '12343 测试大道',@p2 = 'wallsite',@p3 = '44444',@p4 = '55',@p5 = '-92.2',@p6 = ' Pri', @p7 = 'Sec', @p8 = '181' NHibernate: INSERT INTO tg.v_Site (Name, Address, City, PostalCode, Latitude, Longitude, PrimaryGroupName, SecondaryGroupName, StateId) 值 (@p0, @p1, @p2、@p3、@p4、@p5、@p6、@p7、@p8);选择 SCOPE_IDENTITY(); @p0 = '站点',@p1 = '12343 测试大道',@p2 = 'wallsite',@p3 = '55555',@p4 = '55',@p5 = '-92.2',@p6 = 'Pri ', @p7 = 'Sec', @p8 = '180' NHibernate: INSERT INTO tg.v_Site (Name, Address, City, PostalCode, Latitude, Longitude, PrimaryGroupName, SecondaryGroupName, StateId) VALUES (@p0, @p1, @ p2、@p3、@p4、@p5、@p6、@p7、@p8);选择 SCOPE_IDENTITY(); @p0 = '网站墙',@p1 = '12343 测试大道',@p2 = 'walstreet',@p3 = '66666',@p4 = '55',@p5 = '-92.2',@p6 = '普里',@p7 = '秒',@p8 = '181' Pri', @p7 = 'Sec', @p8 = '180' NHibernate: INSERT INTO tg.v_Site (Name, Address, City, PostalCode, Latitude, Longitude, PrimaryGroupName, SecondaryGroupName, StateId) 值 (@p0, @p1, @p2、@p3、@p4、@p5、@p6、@p7、@p8);选择 SCOPE_IDENTITY(); @p0 = '网站墙',@p1 = '12343 测试大道',@p2 = 'walstreet',@p3 = '66666',@p4 = '55',@p5 = '-92.2',@p6 = '普里',@p7 = '秒',@p8 = '181' Pri', @p7 = 'Sec', @p8 = '180' NHibernate: INSERT INTO tg.v_Site (Name, Address, City, PostalCode, Latitude, Longitude, PrimaryGroupName, SecondaryGroupName, StateId) 值 (@p0, @p1, @p2、@p3、@p4、@p5、@p6、@p7、@p8);选择 SCOPE_IDENTITY(); @p0 = '网站墙',@p1 = '12343 测试大道',@p2 = 'walstreet',@p3 = '66666',@p4 = '55',@p5 = '-92.2',@p6 = '普里',@p7 = '秒',@p8 = '181'

NHibernate:选择 DISTINCT site.Id 作为 Id10_0_,site.Name 作为 Name10_0_,site.Address 作为 Address10_0_,site.City 作为 City10_0_,site.PostalCode 作为 PostalCode10_0_,site.Latitude 作为 Latitude10_0_,site.Longitude 作为 Longitude10_0_,site.PrimaryGroupName 作为PrimaryG8_10_0_, site.SecondaryGroupName as Secondar9_10_0_, site.StateId as StateId10_0_ FROM v_Site site WHERE site.Id IN (SELECT Id FROM vw_SearchSite WHERE CONTAINS(vw_SearchSite.*,@p0) ); @p0 = 'abc'

SecondaryGroupName 作为 Secondar9_10_,site0_.StateId 作为 StateId10_ from tg.v_Site site0_ NHibernate:SELECT primarygro0_.SiteId 作为 SiteId1_,primarygro0_.Id 作为 Id1_,primarygro0_.Id 作为 Id0_0_,primarygro0_.Name 作为 Name0_0_,primarygro0_.OldId 作为 OldId0_0_,primarygro0_.DeviceGroupTypeId作为 DeviceGr4_0_0_,primarygro0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup primarygro0_ WHERE ((primarygro0_.DeviceGroupTypeId = 1)) 和 primarygro0_.SiteId=@p0;@p0 = '381' NHibernate:选择 secondaryg0_.SiteId 作为 SiteId1_,secondaryg0_.Id 作为 Id1_,secondaryg0_.Id 作为 Id0_0_,secondaryg0_.Name 作为 Name0_0_,secondaryg0_.OldId 作为 OldId0_0_,secondaryg0_.DeviceGroupTypeId 作为 DeviceGr4_0_0_,secondaryg0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup secondaryg0_ WHERE ((secondaryg0_.DeviceGroupTypeId = 2)) 和 secondaryg0_.SiteId=@p0; @p0 = '381' WHibernate:选择 primarygro0_.SiteId 作为 SiteId1_,primarygro0_.Id 作为 Id1_,primarygro0_.Id 作为 Id0_0_,primarygro0_.Name 作为 Name0_0_,primarygro0_.OldId 作为 OldId0_0_,primarygro0_.DeviceGroupTypeId 作为 DeviceGr4_0_0_,primarygro0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup primarygro0_ ((primarygro0_.DeviceGroupTypeId = 1)) 和primarygro0_.SiteId=@p0;@p0 = '382' NHibernate:选择 secondaryg0_.SiteId 作为 SiteId1_,secondaryg0_.Id 作为 Id1_,secondaryg0_.Id 作为 Id0_0_,secondaryg0_.Name 作为 Name0_0_,secondaryg0_.OldId 作为 OldId0_0_,secondaryg0_.DeviceGroupTypeId 作为 DeviceGr4_0_0_,secondaryg0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup secondaryg0_ WHERE ((secondaryg0_.DeviceGroupTypeId = 2)) 和 secondaryg0_.SiteId=@p0; @p0 = '382' NHibernate:选择 primarygro0_.SiteId 作为 SiteId1_,primarygro0_.Id 作为 Id1_,primarygro0_。Id 为 Id0_0_,primarygro0_.Name 为 Name0_0_,primarygro0_.OldId 为 OldId0_0_,primarygro0_.DeviceGroupTypeId 为 DeviceGr4_0_0_,primarygro0_.SiteId 为 SiteId0_0_ FROM tg.vw_DeviceGroup primarygro0_ WHERE ((primarygro0_.DeviceGroupTypeId = 1)) 和 primarygro0_.SiteId=@p0;@p0 = '383' NHibernate:选择 secondaryg0_.SiteId 作为 SiteId1_,secondaryg0_.Id 作为 Id1_,secondaryg0_.Id 作为 Id0_0_,secondaryg0_.Name 作为 Name0_0_,secondaryg0_.OldId 作为 OldId0_0_,secondaryg0_.DeviceGroupTypeId 作为 DeviceGr4_0_0_,secondaryg0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup secondaryg0_ WHERE ((secondaryg0_.DeviceGroupTypeId = 2)) 和 secondaryg0_.SiteId=@p0; @p0 = '383' NHibernate:选择 primarygro0_.SiteId 作为 SiteId1_,primarygro0_.Id 作为 Id1_,primarygro0_.Id 作为 Id0_0_,primarygro0_.Name 作为 Name0_0_,primarygro0_.OldId 作为 OldId0_0_,primarygro0_。DeviceGroupTypeId 作为 DeviceGr4_0_0_,primarygro0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup primarygro0_ WHERE ((primarygro0_.DeviceGroupTypeId = 1)) and primarygro0_.SiteId=@p0; @p0 = '384' NHibernate:选择 secondaryg0_.SiteId 作为 SiteId1_,secondaryg0_.Id 作为 Id1_,secondaryg0_.Id 作为 Id0_0_,secondaryg0_.Name 作为 Name0_0_,secondaryg0_.OldId 作为 OldId0_0_,secondaryg0_.DeviceGroupTypeId 作为 DeviceGr4_0_0_,secondaryg0_.SiteId 作为 SiteId0_0_ FROM tg.vw_DeviceGroup secondaryg0_ WHERE ((secondaryg0_.DeviceGroupTypeId = 2)) 和 secondaryg0_.SiteId=@p0; @p0 = '384' NHibernate: 选择 device0_.Id 作为 Id7_, device0_.DeviceTypeId 作为 DeviceTy2_7_, device0_.Name 作为 Name7_, device0_.NodeId 作为 NodeId7_, device0_.SiteId 作为 SiteId7_ from tg.v_Device device0_ NHibernate: 选择 connection0_.ConnectionId 作为连接 1_6_,连接 0_。RemoteIP 作为 RemoteIP6_, connection0_.ConnectedOn 作为 Connecte3_6_, connection0_.DisconnectedOn 作为 Disconne4_6_, connection0_.BaseStationId 作为 BaseStat5_6_ from tg.vw_BaseConnection connection0_ NHibernate: 选择 country0_.Id 作为 Id1_, country0_.Name 作为 Name1_ 从 tg.vw_Country country0_ NHibernate: 选择 states0_。 CountryId 作为 CountryId1_, states0_.Id 作为 Id1_, states0_.Id 作为 Id9_0_, states0_.Name 作为 Name9_0_, states0_.Abbreviation 作为 Abbrevia3_9_0_, states0_.CountryId 作为 CountryId9_0_ FROM tg.vw_State states0_ WHERE states0_.CountryId=@p0; @p0 = '347' NHibernate: 选择 states0_.CountryId 作为 CountryId1_, states0_.Id 作为 Id1_, states0_.Id 作为 Id9_0_, states0_.Name 作为 Name9_0_, states0_.Abbreviation as Abbrevia3_9_0_, states0_.CountryId 作为 CountryId9_0_ FROM tg.vw_State states0_ WHERE states0_.CountryId=@p0; @p0 = '348' NHibernate:选择 states0_.CountryId 作为 CountryId1_, states0_.Id 作为 Id1_, states0_.Id 作为 Id9_0_, states0_.Name 作为 Name9_0_, states0_.Abbreviation as Abbrevia3_9_0_, states0_.CountryId 作为 CountryId9_0_ FROM tg.vw_State states0_ WHERE states0_.CountryId=@p0; @p0 = '349' NHibernate: 选择 states0_.CountryId 作为 CountryId1_, states0_.Id 作为 Id1_, states0_.Id 作为 Id9_0_, states0_.Name 作为 Name9_0_, states0_.Abbreviation as Abbrevia3_9_0_, states0_.CountryId 作为 CountryId9_0_ FROM tg.vw_State states0_ WHERE states0_.CountryId=@p0; @p0 = '350' NHibernate: NHibernate: NHibernate: NHibernate: NHibernate:选择 states0_.CountryId 作为 CountryId1_, states0_.Id 作为 Id1_, states0_.Id 作为 Id9_0_, states0_.Name 作为 Name9_0_, states0_.Abbreviation as Abbrevia3_9_0_, states0_.CountryId 作为 CountryId9_0_ FROM tg.vw_State states0_ WHERE states0_.CountryId=@p0 ; @p0 = '350' NHibernate: NHibernate: NHibernate: NHibernate: NHibernate:选择 states0_.CountryId 作为 CountryId1_, states0_.Id 作为 Id1_, states0_.Id 作为 Id9_0_, states0_.Name 作为 Name9_0_, states0_.Abbreviation as Abbrevia3_9_0_, states0_.CountryId 作为 CountryId9_0_ FROM tg.vw_State states0_ WHERE states0_.CountryId=@p0 ; @p0 = '350' NHibernate: NHibernate: NHibernate: NHibernate:

System.Data.SqlClient.SqlException:对象名称“v_Site”无效。

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System .Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System .Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream,布尔异步)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,字符串方法,DbAsyncResult 结果)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,字符串方法)在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader 的 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader( ) 在 NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) 在 NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 的 QueryParameters queryParameters, Boolean returnProxies)

NHibernate.ADOException:无法执行查询 [SELECT DISTINCT site.Id 作为 Id10_0_,site.Name 作为 Name10_0_,site.Address 作为 Address10_0_,site.City 作为 City10_0_,site.PostalCode 作为 PostalCode10_0_,site.Latitude 作为 Latitude10_0_,site.Longitude作为 Longitude10_0_,site.PrimaryGroupName 作为 PrimaryG8_10_0_,site.SecondaryGroupName 作为 Secondar9_10_0_,site.StateId 作为 StateId10_0_ FROM v_Site site WHERE site.Id IN(从 vw_SearchSite WHERE CONTAINS(vw_SearchSite.,?) ) ] Name:pattern - Value:abc [SQL: SELECT DISTINCT site.Id as Id10_0_, site.Name as Name10_0_, site.Address as Address10_0_, site.City as City10_0_, site.PostalCode as PostalCode10_0_, site.Latitude作为 Latitude10_0_,site.Longitude 作为 Longitude10_0_,site.PrimaryGroupName 作为 PrimaryG8_10_0_,site.SecondaryGroupName 作为 Secondar9_10_0_,site.StateId 作为 StateId10_0_ FROM v_Site site WHERE site.Id IN (SELECT Id FROM vw_SearchSite WHERE CONTAINS(vw_SearchSite. ,?) )]

在 NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 在 NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) 在 NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) 在 NHibernate.Loader.Custom.CustomLoader.List(ISessionImplementor session, QueryParameters queryParameters) 在 NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results) 在 NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification规范,QueryParameters 查询参数,IList 结果)在 NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification 规范,QueryParameters 查询参数)在 NHibernate.Impl.SqlQueryImpl.List() 在 Toro.TurfGuard.Common。SiteRepository.cs 中的 Infrastructure.DataAccess.Impl.SiteRepository.GetSitesforSearch(String search):Toro.TurfGuard.Common.IntegrationTests.Infrastructure.DataAccess.Impl.SiteRepositoryTester.Getsitesforsearch_returns_all_matching_sites_test() 中的第 33 行 SiteRepositoryTester.cs:第 109 行

那么,任何人都可以帮助我处理这些异常。立即帮助表示赞赏。

4

1 回答 1

0

表名v_Site,正确吗?

System.Data.SqlClient.SqlException: Invalid object name 'v_Site'
于 2010-07-10T03:46:06.010 回答