2010-12-02 4 views
5

Я пытаюсь отфильтровать коллекцию на основе внешнего ключа. У меня есть два класса, которые сопоставляются сNHibernate using неправильный псевдоним таблицы

public class GroupPriceOverrideMap:ClassMap<GroupPriceOverride> 
    { 
     public GroupPriceOverrideMap() 
     { 
      CompositeId() 
       .KeyReference(x => x.Service,"ServiceCode") 
       .KeyReference(x => x.CustomerAssetGroup, "GroupID"); 

      Map(x => x.Price); 

      Table("accGroupPriceOverride"); 
     } 
    } 

public class CustomerAssetGroupMap:ClassMap<CustomerAssetGroup> 
    { 
     public CustomerAssetGroupMap() 
     { 
      Id(x => x.GroupID).Unique(); 

      Map(x => x.Description); 

      References(x => x.Customer).Column("CustomerID"); 

      HasMany<GroupPriceOverride>(x => x.PriceOverrides).KeyColumn("GroupID"); 

      Table("accCustAssetGroup"); 
     } 
    } 

я запрашиваю его с помощью

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup.GroupID == groupID) 

Однако это порождающие

SELECT this_.ServiceCode as ServiceC1_9_0_, this_.GroupID as GroupID9_0_, this_.Price as Price9_0_ FROM accGroupPriceOverride this_ WHERE customeras1_.GroupID = @p0 

там, где положение ссылается псевдоним таблицы, который не существует (customeras1). Это, вероятно, псевдоним для скрещивания с командой customerassetgroup, но нет необходимости выполнять этот крест. Я уверен, что это просто что-то в моем сопоставлении с неправильным, но я не могу его найти. Я пробовал переименовать столбцы в случае, если присутствие группыID в обеих таблицах вызывало проблемы, но это не исправило. Есть идеи?

Редактировать Я обнаружил, что если я опрошен делать

_session.Linq<CustomerAssetGroup>().Where(x => x.GroupID == groupID).FirstOrDefault().PriceOverrides; 

тогда я получил правильный результат. Я также обнаружил, что если бы я сохранил GroupPriceOverride, а затем запросил его с помощью HQL, он не будет найден, но я все равно могу найти объект, загрузив родителя и посмотрев на его коллекцию переопределений.

_session.CreateQuery("FROM GroupPriceOverride i").List().Count;//returns 0 
_session.CreateQuery("FROM CustomerAssetGroupi").List().FirstOrDefault().PriceOverrides.Count;//returns 1 

ответ

1

Похож на ошибку в старом провайдере LINQ. Не могли бы вы сообщить об ошибке здесь:

https://nhibernate.jira.com/secure/Dashboard.jspa

Вы можете быть в состоянии получить вокруг него с помощью:

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group) 

и пусть NHibernate выяснить ID. Если вы не имеете группы уже, вы можете сделать это:

var group = _session.Load<CustomerAssetGroup>(groupID); 
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group) 

ISession.Load (идентификатор) будет генерировать только прокси-сервер, но не на самом деле попали в базе данных до тех пор, пока доступ к свойству (который вам не будет, поскольку вы просто используете его для указания ID).

+0

Спасибо, Джеймс, я создал единичный тест, чтобы продемонстрировать и открыть проблему. Http://216.121.112.228/browse/NHLQ-83 – stimms 2010-12-03 16:25:43

Смежные вопросы