【问题标题】:Linq to NHibernate does not return proper dataLinq to NHibernate 不返回正确的数据
【发布时间】:2010-08-19 22:08:48
【问题描述】:

我有课

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 应用程序)

【问题讨论】:

  • 你的最后一句话毫无意义。您可以从 Item 继承子类,并且仍然使用 Item 类型来访问子类的实例。
  • @Timwi,你是对的,我会编辑以正确传达意图

标签: c# linq nhibernate interface


【解决方案1】:

这看起来像是旧的 contrib Linq 提供程序中的一个错误。

尝试使用 NHibernate 3,它按预期工作。

【讨论】:

【解决方案2】:

我相信您需要映射 IItem 而不是具体的 Item 类才能正常工作。

【讨论】:

    【解决方案3】:

    你可以尝试的事情:

    • 而不是

      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;
      

    【讨论】:

      【解决方案4】:

      我认为您不必担心查询具体类型,这很好。只需让您的存储库方法返回一个接口。有意义吗?

      public IItem GetItem(int id)
      {
      
        var item = from i in session.Linq<Item>()
                      where i.IsActive == true
                      select i;
      
        return item;
      
      }
      

      这将使您可以按应有的方式查询工作,并让所有依赖代码针对接口工作,这就是您真正需要的接口。

      【讨论】:

        【解决方案5】:

        我发布了一个similar issue here 并最终放弃了休眠(但是出于不相关的原因)。我认为 LINQ 在休眠中还没有真正“完成”,仍然有一些方法,即 Enumerable() 会抛出未实现的异常。

        但是,为了回答您的问题,我发现我必须使用具体类而不是接口,因为接口没有 *.hbm.xml 文件,因此休眠不知道如何将接口映射到其各自的表。正如有人在我的帖子中所说,我可能把这种松散耦合的事情走得太远了,因为你应该只在可能发生大量变化的领域使用松散耦合和控制反转——但是是的,数据库模型确实发生了很大变化。

        我认为这里的关键是确保您的业务域位于其自己的程序集“MyBusiness.Domain”中,并让所有项目都引用它。然后,所有这些项目都将具有指定的接口(按合同设计)和具体的类,并使用 Ninject 之类的东西注入,这样您就可以在业务领域中实例化新类,只要它们实现了相关接口,您的项目就可以使用它们。

        如你所见,我不是这方面的专家……但是……但我认为这种开发软件的方式基本上做得很好,而且刚开始时相当复杂!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多