【问题标题】:Join Tables using Fluent Nhibernate使用 Fluent Nhibernate 连接表
【发布时间】:2015-06-09 01:38:05
【问题描述】:

我有以下表结构

Author[AuthorId,AuthorName];
Book [BookId, BookName, AuthorId];

并且已经为 F.N 映射创建了以下类

public class Author
{
    public virtual int AuthorId         { get; set; }
    public virtual string AuthorName    { get; set; }

    public IList<Book> Book { get; set; }
}

public class AuthorDataMap : ClassMap<Auther>
{
    public MaisonUserDataMap()
    {
        Table("author");
        Id(x => x.AuthorId).Column("authorID");
        Map(x => x.AuthorName).Column("authorName");

        HasMany<MonsterData>(p => p.monsterData)
        .KeyColumn("authorID")
        .PropertyRef("AuthorId").Inverse();
}


public class Book
{
    public virtual int BookId           { get; set; }
    public virtual string BookName      { get; set; }
    public virtual int AuthorId         { get; set; }

    public virtual Author Author { get; set; }

        public Book()
        {
            Author = new Author();
        }
}


class BookMap : ClassMap<Book>
{
        public BookMap()
        {
            Table("book");
            Id(x => x.BookId).Column("bookId");
            Map(x => x.BookName).Column("bookName");
            Map(x => x.AuthorId).Column("authorId");

            References(x => x.Author);
        }
}

并且使用以下 NH 查询,它将为每个作者返回单个对象及其相关书籍的列表

var authorList = session.CreateCriteria<Auther>("AuthorList").Add(Restrictions.Eq("AuthorList.AuthorId", 1)).List<Author>(); // working

Console.WriteLine("AuthorList Count :" + authorList.Count);
foreach (var item in authorList)
{

    foreach (var k in item.book)
    {
        Console.WriteLine("BookId :" + k.bookId);
    }

}

现在我想获取书籍对象列表及其作者详细信息。 (与上述相反)。我尝试使用以下代码进行操作,但没有返回任何作者详细信息

var bookList = session.CreateCriteria<Book>("Book").Add(Restrictions.Eq("Book.AuthorId", 1)).List<Book>();
Console.WriteLine("BookList Count :" + bookList.Count);
foreach (var item in bookList)
{
    Console.WriteLine("BookId :" + item.bookId);
    Console.WriteLine("AuthorName :" + item.Author.authorName);
}

如果有人知道怎么做,请告诉我。谢谢

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping


    【解决方案1】:

    如果我们想使用一列映射到两个属性,映射应该是这样的:

    public BookMap()
    {
        Table("book");
        Id(x => x.BookId).Column("bookId");
        Map(x => x.BookName).Column("bookName");
    
        // authorId column for both
        Map(x => x.AuthorId)
           .Column("authorId")
           .Not.Insert()
           .Not.Update()
           ;
    
        References(x => x.Author, "authorId");
    }
    

    所以,现在我们明确地说到 fluent NHibernate - “authorId”有值类型和引用类型表示。其中之一必须是只读的 - 才能正确生成 INSERT 和 UPDATE。

    现在这个查询可以工作了

    var bookList = session
      .CreateCriteria<Book>("Book")
      .Add(Restrictions.Eq("Book.AuthorId", 1))
      .List<Book>();
    
    Console.WriteLine("BookList Count :" + bookList.Count);
    foreach (var item in bookList)
    {
        Console.WriteLine("BookId :" + item.bookId);
        Console.WriteLine("AuthorName :" + item.Author.authorName);
    }
    

    注意,另一方(作者)现在可以定义没有属性 ref 的 HasMany

    HasMany(a => a.Books)
        .KeyColumn("authorID")
        //.PropertyRef("AuthorId") // there will be Author reference
        .Inverse();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2014-01-24
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多