Дочерние объекты не заполняются только при использовании SQLite (работает в SQL Server) - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть отображение Fluent NHibernate, которое работает, как и ожидалось, когда я запускаю его для фактической базы данных SQL Server, но при этом не запускает коллекцию дочерних объектов при запуске с SQLite. Запрашиваемая структура представляет собой иерархию учетных записей с самостоятельными ссылками, в которой каждая учетная запись может иметь одну родительскую и 0-M дочернюю учетные записи. Родительская учетная запись загружается правильно, но список дочерних объектов всегда возвращается null.

Базовая структура таблицы выглядит примерно так ( Примечание: Я пропустил большинство полей, которые не имеют ничего общего с этой проблемой.)

Account
-------
AccountID
Title
ParentAccountID

Класс Account выглядит так:

public class Account
{
    public virtual int ID { get; set; }
    public virtual string Title { get; set; }
    public virtual Account ParentAccount { get; set; }
    public virtual IList<Account> ChildAccounts { get; set; }
}

Отображение для класса Account выглядит следующим образом:

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        Table("Accounts");

        Id(a => a.ID).Column("AccountID").GeneratedBy.Assigned();
        Map(a => a.Title);
        HasMany<Account>(a => a.ChildAccounts)
            .Table("Accounts")
            .KeyColumn("ParentAccountID")
            .ForeignKeyConstraintName("AccountID")
            .OrderBy("Title")
            .Inverse();
        References<Account>(a => a.ParentAccount).Column("ParentAccountID");
    }
}

Данные в таблице «Учетные записи» в базе данных SQLite, когда я пытаюсь получить идентификатор учетной записи:

ID        Title        ParentAccountID
--        -----        ---------------
1         Account1     null
2         Account2     1
3         Account3     2
4         Account4     2

Когда я звоню session.Get<Account>(2) я получаю следующий объект:

{
    ID: 2,
    Title: "Account2",
    ParentAccount: 
    {
        ID: 1,
        Title: "Account1",
        ParentAccount: null,
        ChildAccounts: null
    },
    ChildAccounts: null
}

Выполнение одного и того же вызова для реального возврата базы данных SQL Server:

{
    ID: 2,
    Title: "Account2",
    ParentAccount: 
    {
        ID: 1,
        Title: "Account1",
        ParentAccount: null,
        ChildAccounts: 
        {
            ID: 2,
            Title: "Account2",
            ParentAccount: 
            {
            ...
            },
            ChildAccounts:
            {
            ...
            }
        }
    },
    ChildAccounts: 
    [
        {
            ID: 3,
            Title: "Account3",
            ParentAccount: 
            {
                ID: 2,
                Title: "Account2",
                ParentAccount: 
                {
                ...
                },
                ChildAccounts:
                {
                ...
                }
            },
            ChildAccounts: null
        },
        {
            ID: 4,
            Title: "Account4",
            ParentAccount: 
            {
                ID: 2,
                Title: "Account2",
                ParentAccount: 
                {
                ...
                },
                ChildAccounts:
                {
                ...
                }
            },
            ChildAccounts: null
        }
    ]
}

Я действительно не понимаю, почему это будет работать в SQL Server, а не в SQLite, но это затрудняет написание теста, чтобы убедиться, что мои отображения и код репозитория работают правильно, очень сложно.

1 Ответ

0 голосов
/ 03 июня 2011

Вы пытались профилировать базу данных sqlite с помощью программы профилирования sql?Я предполагаю, что профилировщик работает с sqlite, но я никогда не пробовал.

Другая вещь, на которую стоит обратить внимание, - это файл журнала nhibernate.Обычно, когда у меня возникают подобные проблемы, я начинаю с этих двух инструментов.

...