5

Tôi có điều này mã ASP.NET MVC3 đó là cung cấp bởi mùa xuân và thành thạo NHibernate (NHib 3.1)không thể giải quyết bất động sản: User.Full_Name của: Harrods.Core.Entities.Teacher

Tôi có lỗi này:

could not resolve property: User.Full_Name of: Harrods.Core.Entities.Teacher 

[QueryException: could not resolve property: User.Full_Name of: Harrods.Core.Entities.Teacher] 
NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(String propertyName) +104 
NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(String alias, String propertyName) +57 
NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(String alias, String propertyName) +100 
NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(String alias, String propertyName) +53 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria subcriteria, String propertyName) +184 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName) +134 
NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, String propertyName) +45 
NHibernate.Criterion.CriterionUtil.GetColumnNames(String propertyName, IProjection projection, ICriteriaQuery criteriaQuery, ICriteria criteria, IDictionary`2 enabledFilters) +46 
NHibernate.Criterion.InsensitiveLikeExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +101 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +298 
NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters) +447 
NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) +175 
NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +412 
NHibernate.Impl.CriteriaImpl.List(IList results) +80 
NHibernate.Impl.CriteriaImpl.List() +104 
NHibernate.Criterion.QueryOver`1.List() +96 
NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.List() +75 

Đây là mã rằng vấn đề có vẻ là đến từ:

return session.QueryOver<Teacher>() 
        .Where(x => x.User.Full_Name.IsInsensitiveLike("%" + Search + "%")) 
        .OrderBy(x => x.Id).Asc 
        .Skip((skip - 1) * take) 
        .Take(take) 
        .List<Teacher>(); 

lớp giáo viên của tôi trông như thế này:

[Serializable] 
public class Teacher 
{ 

    public virtual User User { get; set; } 
} 

Và lớp người dùng của tôi trông giống như sau:

public class User : BaseEntity<User> 
{ 

    public virtual string Email { get; set; } 
    public virtual string Full_Name { get; set; } 
} 

Không chắc những gì đang đưa ra các vấn đề. Mọi thứ đều ổn với tôi. Bất cứ ai có bất cứ ý tưởng gì sai? :)

Không chắc nhưng họ trông hơi giống nhau, nhưng không thực sự hiểu làm thế nào để giải quyết anyway:

NHibernate.QueryException with dynamic-component A correct way to load entities by Id list when Id is not mapped

EDIT: Cố gắng này, nhưng vẫn đem lại cho các lỗi tương tự : -

return session.QueryOver<Teacher>() 
        .JoinQueryOver<User>(u => u.User) 
        .Where(x => x.Full_Name.IsInsensitiveLike("%" + FullNameSearchFilter + "%")) 
        .OrderBy(x => x.Id).Asc 
        .Skip((skip - 1) * take) 
        .Take(take) 
        .List<Teacher>(); 

bí danh Cố gắng cũng ..:

0.123.
return session.QueryOver<Teacher>() 
        .JoinAlias(() => ML.User,() => U) 
        .Where(() => U.Full_Name.IsInsensitiveLike("%" + FullNameSearchFilter + "%")) 
        .OrderBy(x => x.Id).Asc 
        .Skip((skip - 1) * take) 
        .Take(take) 
        .List<Teacher>(); 

Không hoạt động!

EDIT 2

mã sql đang được cho thấy một cách chính xác; Tôi có thể xác minh điều này thông qua NHibernate Profiler của tôi. Nhưng vì một lý do nào đó khi dữ liệu đã được tải, nó sẽ xuất hiện lỗi và giao dịch được khôi phục. Bây giờ nó xuất hiện với tôi rằng điều này không còn chỉ là về truy vấn?

Trả lời

4

Bạn sẽ phải sử dụng JoinQueryOver hoặc JoinAlias để thực hiện những gì bạn đang yêu cầu.

What is the difference between JoinQueryOver and JoinAlias?

Hãy xem phần AssociationsAliases trong bài viết này: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

+0

Đây là những gì tôi đã thử, nhưng stil Tôi không làm việc, hãy sửa tôi nếu tôi viết sai điều gì đó .. :) phiên trả lại.QueryOver () .JoinQueryOver (u => u.User) .Where (x => x.Full_Name.IsInsensitiveLike (" % "+ FullNameSearchFilter +"% ")) .OrderBy (x => x.Id) .Asc .Skip ((bỏ qua - 1) * take) .Hãy lấy (take) .List (); – RicL

+0

Cả hai phương pháp đều không hoạt động! :/Cả JoinQueryOver và JoinAlias ​​đều cung cấp cùng một lỗi chính xác. – RicL

+1

Có phải 'Full_Name' là một cột được ánh xạ trong' Người dùng' không? Còn 'MasterLicensee' là gì? Bạn không nên trở về một danh sách các 'Giáo viên' thay vì' MasterLicensee'? –

2

này đã làm việc cho tôi:

User userAlias = null; 
var list = session.QueryOver<Teacher>() 
        .JoinQueryOver(x => x.User,() => userAlias, JoinType.LeftOuterJoin) 
        .Where(x => x.FullName.IsInsensitiveLike("%" + "test" + "%")) 
        .OrderBy(x => x.Id).Asc 
        .Skip(1) 
        .Take(2) 
        .List(); //Without MasterLicensee 

Được sản xuất SQL (Tôi đang sử dụng SQL CE cho các bài kiểm tra):

SELECT 
    this_.Id as Id2_1_, 
    this_.User_id as User2_2_1_, 
    useralias1_.Id as Id3_0_, 
    useralias1_.Email as Email3_0_, 
    useralias1_.FullName as FullName3_0_ 
FROM 
    "Teacher" this_ 
left outer join 
    "User" useralias1_ 
     on this_.User_id=useralias1_.Id 
WHERE 
    lower(useralias1_.FullName) like @p0 
ORDER BY 
    useralias1_.Id asc; 
@p0 = '%test%' [Type: String (0)] 
+0

mã sql đang được hiển thị chính xác; Tôi có thể xác minh điều này thông qua NHibernate Profiler của tôi. Nhưng vì một lý do nào đó khi dữ liệu đã được tải, nó sẽ xuất hiện lỗi và giao dịch được khôi phục. Bây giờ nó xuất hiện với tôi rằng điều này không còn chỉ là về truy vấn? – RicL

+0

Giải pháp của bạn cũng hoạt động! Cảm ơn! – RicL

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