2010-08-19 65 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的注入方式注入,这样您就可以在业务域中实例化新类,并且只要它们实现项目可以使用的相关接口即可。

正如你所看到的,我不是这方面的专家......但是我认为这种开发软件的方式基本上是正确的,开始时它相当复杂!