我有一个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");
    }
}


当我尝试检索帐户ID时,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中起作用,但是这使得编写测试来确保我的映射和存储库代码正确运行非常困难。

最佳答案

您是否尝试过使用SQL事件探查器来探查sqlite数据库?我假设探查器可与sqlite一起使用,但我从未尝试过。

要查看的另一件事是nhibernate日志文件。通常,当我遇到这样的问题时,这两个工具就是我的起点。

关于c# - 仅在使用SQLite时才填充子对象(在SQL Server中工作),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4336774/

10-11 22:59
查看更多