gpt4 book ai didi

c# - 使用 Fluent NHibernate 映射树结构

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:04 26 4
gpt4 key购买 nike

我在使用 Fluent NHibernate 映射树结构时遇到了麻烦,而且还不必输入我认为是 hack 的内容。

考虑以下类:

  • Node (抽象,有int IdGroupNode Parent(如果null,节点驻留在根节点))
  • GroupNode (继承自 Node ,有 IList<GroupNode> GroupsIList<ItemNode> Items )
  • ItemNode (继承自 Item)

理想情况下,这将具有以下数据库结构:

  • GroupNodes(整数 Id,可为 null 的整数 ParentId)
  • ItemNodes(整数 Id,可为 null 的整数 ParentId)

我的映射器看起来像这样:

public class GroupNodeMap : ClassMap<GroupNode>
{
public GroupNode()
{
Id(x => x.Id);
References(x => x.Parent);
HasMany(x => x.Groups).LazyLoad();
HasMany(x => x.Items).LazyLoad();
}
}

public class ItemNodeMap : ClassMap<ItemNode>
{
public ItemNodeMap()
{
Id(x => x.Id);
References(x => x.Parent);
}
}

不幸的是,这会创建一组重复的引用(每个表都有一个 ParentId 和一个 GroupNodeId 。我可以通过在 .KeyColumn("ParentId") 之后添加 .LazyLoad() 来调整这种行为,但这感觉像是一个 hack,我希望使用约定或 lambda 表达式而不是魔术字符串来表达它。

谁能指出我正确的方向?

最佳答案

这是您可以尝试使用 AutoMap 约定和 SQLite 的示例:

namespace Entities
{
public abstract class Node
{
public virtual int Id { get; set; }
public virtual GroupNode Parent { get; set; }
}

public class ItemNode : Node
{
}

public class GroupNode : Node
{
public virtual IList<GroupNode> Groups { get; set; }
public virtual IList<ItemNode> Items { get; set; }
}
}

class Program
{
static void Main()
{
if (File.Exists("data.db3"))
{
File.Delete("data.db3");
}

using (var factory = CreateSessionFactory())
{
using (var connection = factory.OpenSession().Connection)
{
ExecuteQuery("create table GroupNode(Id integer primary key, Parent_Id integer)", connection);
ExecuteQuery("create table ItemNode(Id integer primary key, Parent_Id integer)", connection);

ExecuteQuery("insert into GroupNode(Id, Parent_Id) values (1, null)", connection);
ExecuteQuery("insert into GroupNode(Id, Parent_Id) values (2, 1)", connection);
ExecuteQuery("insert into GroupNode(Id, Parent_Id) values (3, 1)", connection);

ExecuteQuery("insert into ItemNode(Id, Parent_Id) values (1, 1)", connection);
ExecuteQuery("insert into ItemNode(Id, Parent_Id) values (2, 1)", connection);
}

using (var session = factory.OpenSession())
using (var tx = session.BeginTransaction())
{
var node = session.Get<GroupNode>(1);
tx.Commit();
}
}
}

private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(
SQLiteConfiguration.Standard.UsingFile("data.db3").ShowSql()
)
.Mappings(
m => m.AutoMappings.Add(
AutoMap
.AssemblyOf<Program>()
.Where(t => t.Namespace == "Entities")
)
).BuildSessionFactory();
}

static void ExecuteQuery(string sql, IDbConnection connection)
{
using (var command = connection.CreateCommand())
{
command.CommandText = sql;
command.ExecuteNonQuery();
}
}
}

关于c# - 使用 Fluent NHibernate 映射树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com