NHibernate 3.0 IQueryable ghost column selection

I get a strange error when starting what seems like a simple request.

return (from x in session.Query<Contact>()
                .Where(x => x.Id == 10)
               select new ContactIndexViewModel
               {
                   Id = x.Id,
                   Name = x.BasicInfo.FirstName + " " + x.BasicInfo.LastName,
                   Filters = x.Filters
               }).FirstOrDefault();

Generates the following SQL

select 
    contact0_.[Id] as col_0_0_, 
    contact0_.[BasicInfoFirstName] as col_1_0_, 
    contact0_.[BasicInfoLastName] as col_2_0_, 
    . as col_3_0_,
    filters1_.[Id] as column1_16_, 
    filters1_.Criteria1 as Criteria2_16_, 
    // .. .more filters1_ fields
    filters1_.ContactId as ContactId16_ 
from 
    [MyServer].[dbo].[Contact] contact0_ 
    inner join [MyServer].[dbo].[Filter] filters1_ 
        on contact0_.[Id]=filters1_.ContactId
where
    contact0_.[Id]=@p0

Note the selected fourth column . BasicInfo is the component, and select (in the request) includes all the fields defined in the ViewModel.

I have no other problems with Contact or Filter objects in other parts of the application. Contact → Filter has a one relationship.

Any idea on how to debug or what might cause this?

UPDATE

If you remove the Filters link in select, the problem disappears.

UPDATE Matching Mappings

Contact

public partial class ContactMap : ClassMap<Contact>
{
    /// <summary>Initializes a new instance of the <see cref="ContactMap"/> class.</summary>
    public ContactMap()
    {
        Table("[MyServer].[dbo].[Contact]");
        OptimisticLock.Version();
        DynamicUpdate();
        LazyLoad();

        Id(x=>x.Id)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[Id]")
            .GeneratedBy.Identity();
        Version(x=>x.RecordVersion)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[RecordVersion]")
                .CustomSqlType("timestamp")
                .Not.Nullable()
            .UnsavedValue("null")
            .CustomType("BinaryBlob")
            .Generated.Always();
        Map(x=>x.Active).Access.CamelCaseField(Prefix.Underscore);
        // other scalar properties
        Component(x0=>x0.BasicInfo, m0=>
        {
            m0.Map(x1=>x1.FirstName).Column("[BasicInfoFirstName]").Access.CamelCaseField(Prefix.Underscore);
            m0.Map(x1=>x1.LastName).Column("[BasicInfoLastName]").Access.CamelCaseField(Prefix.Underscore);
            // other scalar properties
        });

        // other relationships

        HasMany(x=>x.Searches)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.AllDeleteOrphan()
            .Fetch.Select()
            .Inverse()
            .LazyLoad()
            .KeyColumns.Add("ContactId");           
    } 
} 

Search

public partial class SearchMap : ClassMap<Search>
{
    public SearchMap()
    {
        Table("[MyServer].[dbo].[Search]");
        OptimisticLock.Version();
        DynamicUpdate();
        LazyLoad();

        Id(x=>x.Id)
            .Access.CamelCaseField(Prefix.Underscore)
            .Column("[Id]")
            .GeneratedBy.Identity();
        Map(x=>x.Controller).Not.Nullable().Access.CamelCaseField(Prefix.Underscore);
        Map(x=>x.Module).Not.Nullable().Access.CamelCaseField(Prefix.Underscore);
        Map(x=>x.Name).Column("[Name]").Not.Nullable().Access.CamelCaseField(Prefix.Underscore);

        References(x=>x.Contact)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.All()
            .Fetch.Select()
            .Columns("ContactId");
        HasMany(x=>x.DataFilters)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.AllDeleteOrphan()
            .Fetch.Select()
            .Inverse()
            .LazyLoad()
            .KeyColumns.Add("SearchId");
    } 
} 
+3
source share
2 answers

Have you displayed filters using FetchMode.Join?

, ContactIndexViewModel , , . , Get , .

var contact = session.Get<Contact>(10);

return new ContactIndexViewModel
{
     Id = contact.Id,
     Name = contact.BasicInfo.FirstName + " " + contact.BasicInfo.LastName,
     Filters = contact.Filters
};
0

.

Table("[MyServer].[dbo].[Contact]");

, , ( "[...]" ) NHibernate. :

Schema("dbo");
Table("Contact");

, . , , - NHibernate .

0

All Articles