Collections Fluent NHibernate Fluent映射对象和对象集合

Collections Fluent NHibernate Fluent映射对象和对象集合,collections,fluent-nhibernate,fluent-nhibernate-mapping,Collections,Fluent Nhibernate,Fluent Nhibernate Mapping,我对流利的Nhibernate(FNH)或Nhibernate(甚至是ORMs)都是新手。我有一个宠物项目,我用它来学习FNH,我被困在里面,看起来像是一个设计问题。这是一个基本的图书馆管理系统,我有一些对象,如书籍、用户、booksize(!)等。例如,我有一个booksize类及其管理器BookSizesManager,其中包含booksize对象列表。请任何人告诉我如何为这两个对象创建类映射,以便我的数据库(为了测试目的,比如SQLite数据库)只有一个名为“BookSizes”的表,并列

我对流利的Nhibernate(FNH)或Nhibernate(甚至是ORMs)都是新手。我有一个宠物项目,我用它来学习FNH,我被困在里面,看起来像是一个设计问题。这是一个基本的图书馆管理系统,我有一些对象,如书籍、用户、booksize(!)等。例如,我有一个booksize类及其管理器BookSizesManager,其中包含booksize对象列表。请任何人告诉我如何为这两个对象创建类映射,以便我的数据库(为了测试目的,比如SQLite数据库)只有一个名为“BookSizes”的表,并列出BookSizeManager中的所有BookSize对象

我当前的实现如下所示,并且有缺陷,因为它生成了两个表1。书本大小2。BookSizes(来自BookSizeManager映射)

我的书本大小的班级

public class BookSize
{
    public virtual string ID { get; set; }
    public virtual string Name { get; set; }
    public virtual double Length { get; set; }
    public virtual double Width { get; set; }
}
对应的类映射

public class BookSizeMap : ClassMap<BookSize>
{
    public BookSizeMap()
    {
        Id(x => x.ID);
        Map(x => x.Name);
        Map(x => x.Length);
        Map(x => x.Width);
    }
}
public class BookSizesManagerMap : ClassMap<BookSizesManager>
{
    public BookSizesManagerMap()
    {
        Id(x => x.Id);
        HasMany(x => x.Items)
            .Cascade.All();
        Table("BookSizes");
    }
}
公共类BookSizeMap:ClassMap
{
公共图书地图
{
Id(x=>x.Id);
Map(x=>x.Name);
Map(x=>x.Length);
地图(x=>x.Width);
}
}
我的图书管理员班

public class BookSizesManager
{
    public virtual string Id { get; set; }

    private IList<BookSize> m_bookSizes = new List<BookSize>();
    public virtual IList<BookSize> Items
    {
        get { return new ReadOnlyCollection<BookSize>(m_bookSizes); } 
        set { if(value != null) m_bookSizes = value; }
    }

    public virtual void Add(BookSize size)
    {
        if (size != null)
        {
            m_bookSizes.Add(size); 
        }
    }// Also contains other unimplemented CRUD methods, but haven't listed them here to reduce 'noise'
}
公共类图书管理员
{
公共虚拟字符串Id{get;set;}
private IList m_bookSizes=new List();
公共虚拟IList项目
{
获取{returnnewreadonlycollection(m_bookSizes);}
设置{if(value!=null)m_=value;}
}
公共虚拟空白添加(书本大小)
{
如果(大小!=null)
{
m_bookSizes.添加(大小);
}
}//还包含其他未实现的CRUD方法,但此处未列出它们以减少“噪音”
}
对应的类映射

public class BookSizeMap : ClassMap<BookSize>
{
    public BookSizeMap()
    {
        Id(x => x.ID);
        Map(x => x.Name);
        Map(x => x.Length);
        Map(x => x.Width);
    }
}
public class BookSizesManagerMap : ClassMap<BookSizesManager>
{
    public BookSizesManagerMap()
    {
        Id(x => x.Id);
        HasMany(x => x.Items)
            .Cascade.All();
        Table("BookSizes");
    }
}
公共类booksizemanagermap:ClassMap
{
公共图书izManagerMap()
{
Id(x=>x.Id);
HasMany(x=>x.Items)
.Cascade.All();
表(“书架”);
}
}

非常感谢您的帮助。提前感谢。

我将彻底摆脱
booksizemanager
,直接使用会话并明确指定表名

public class BookSizeMap : ClassMap<BookSize>
{
    public BookSizeMap()
    {
        Table("BookSizes");
        ...
    }
}
公共类BookSizeMap:ClassMap
{
公共图书地图
{
表(“书架”);
...
}
}
booksizemanager.Add(booksize)变成
session.Save(booksize)

booksizemanager.Get(booksizeId)变成
session.Get(booksizeId)

除CRUD外,BookSizeManager做什么?我的意思是,当你使用NHibernate时,你已经有了
i会话
来完成回复Firo的关键任务。是的,我打算让BookSizeManager执行CRUD操作。因此,为什么需要两个类。我知道一个人可以使用FNH本身执行CRUD操作。我更想让一个“经理”来执行所有CRUD操作。因此,每当我需要从应用程序中获取某些信息时,都可以在应用程序中“随时访问”它,而不是使用FNH查询它。我不确定我是否站在设计原则的正确一边。原谅我的无知,指引我。再次感谢您的回答!听起来像是一个缓存或是在内存中保存经常需要的数据的东西,没有什么需要持久化的。如果没有什么东西必须是持久的,那么也要去掉NHibernate,并在集合上使用LINQ。如果您需要desctop应用程序的指导,我建议您确定。有道理。我确实想要书等被保存下来。但后来也听说过能够缓存东西的ORM。此外,这些查询是否足够高效,即比直接查询数据库(例如使用LINQtoSQL)更好?感谢您耐心地对待我的幼稚。单次数据库调用的性能通常没有问题,它会多次查询数据库(例如在循环中),这会导致性能下降。通过批处理选择、连接表和使用NHibernates一级和二级缓存,可以解决这一问题。我正试图使这个库具有可扩展性,并且易于插入各种接口,例如桌面应用程序或Web应用程序。在web上,我们可能有许多“公共查询”,最好将查询结果缓存起来。我想我必须在FNH中对缓存进行更多的事实调查。如果你知道,你能为我这样的新手推荐一些好的例子链接吗?谢谢