2010-08-19 62 views
0

我有一個類的LINQ to NHibernate的不返回正確的數據

public class Item : IItem 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual bool IsActive { get; set; } 
} 
public interface IItem 
{ 
    Guid Id { get; set; } 
    string Name { get; set; } 
    bool IsActive { get; set; } 
} 

public class ItemMap : ClassMap<Item> 
{ 
    public ItemMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.IsActive); 
    } 
} 

在我的數據庫中,我創建了五個項目。三個將IsActive標誌設置爲true,另外兩個將其設置爲false。

當使用它返回所有五個項目的接口:

 var q = from i in session.Linq<IItem>() 
       where i.IsActive == true 
       select i; 

然而,使用具體的類,當它返回正確的三個項目:

 var q = from i in session.Linq<Item>() 
       where i.IsActive == true 
       select i; 

編輯
我會喜歡返回一個接口,因爲我已經讀過,我應該返回非具體的類。請注意,實際上,這些Linq查詢位於不同項目的存儲庫中(以防成爲Web或WPF應用程序)

+0

你最後一句話沒有意義。你可以從Item中繼承子類,並且仍然使用Item類型來訪問子類的實例。 – Timwi 2010-08-19 22:14:24

+0

@Timwi,你是對的,我會編輯,以正確傳達意圖 – 2010-08-19 22:45:26

回答

1

它看起來像一箇舊contrib Linq提供程序中的錯誤。

嘗試使用NHibernate 3,它按預期工作。

+0

謝謝,@Diego工作。然而,它需要一些運行,需要重新構建程序集。 http://stackoverflow.com/questions/2349400/how-to-get-fluent-nhibernate-working-with-nhibernate-3-x – 2010-08-22 13:54:19

0

我相信您需要映射IItem而不是具體的Item類才能執行此項工作正常。

0

事情你可以嘗試:

  • 而不是

    public class ItemMap : ClassMap<Item> 
    

    使用

    public class ItemMap : ClassMap<IItem> 
    
  • 可簡單地把返回的對象:

    var q = from i in session.Linq<Item>() 
         where i.IsActive == true 
         select (IItem)i; 
    
0

我不認爲你需要擔心查詢具體類型,這很好。只需讓您的存儲庫方法返回一個接口。合理?

public IItem GetItem(int id) 
{ 

    var item = from i in session.Linq<Item>() 
       where i.IsActive == true 
       select i; 

    return item; 

} 

這將讓你查詢的工作,因爲它應該讓反對的接口,這是你真正需要的接口,反正所有的相關代碼的工作。

0

我已經發布了一個similar issue here,並最終刪除了休眠(但無關的原因)。我不認爲LINQ在hibernate中真的「完成」了,但仍然有一些方法,即Enumerable()拋出了一個未實現的異常。

但是,爲了回答你的問題,我發現我必須使用具體類而不是接口,因爲接口沒有* .hbm.xml文件,所以hibernate不知道如何將接口映射到其相應的表。正如有人在我的文章中所說的那樣,我可能把這個鬆散耦合的東西放得太遠了,因爲你應該只在可能發生很多變化的區域使用鬆耦合和控制反轉 - 但是數據庫模型確實改變了很多。

我認爲這裏的關鍵是確保您的業務領域是在自己的大會「MyBusiness.Domain」,並讓所有項目引用此。然後,所有這些項目都將具有指定的接口(按合同設計)和具體類,並使用類似Ninject的注入方式注入,這樣您就可以在業務域中實例化新類,並且只要它們實現項目可以使用的相關接口即可。

正如你所看到的,我不是這方面的專家......但是我認爲這種開發軟件的方式基本上是正確的,開始時它相當複雜!