如何使用多对多将NHibernate从表A映射到表A本身?
请帮忙!我想不出如何映射以下情况: 我只有一张桌子 [表]用户{id,name} 我的班级看起来像这样如何使用多对多将NHibernate从表A映射到表A本身?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,请帮忙!我想不出如何映射以下情况: 我只有一张桌子 [表]用户{id,name} 我的班级看起来像这样 public class User { public int Id { get; set; } public string Name { get; set; } public ISet<User> Friends { get; set; } } 公共类用户 { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共ISet好友{get;set
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public ISet<User> Friends { get; set; }
}
公共类用户
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ISet好友{get;set;}
}
每个用户都与其他用户有关系。e、 g.“用户A”可以有许多朋友,而这些朋友是其他用户
这个映射应该是什么?我认为这应该是多对多的关系,但我真的不知道HBM会是什么样子
谢谢
我认为这应该是多对多
关系
你说得对。在您的场景中,您将需要使用自引用的多对多映射。但是使用单个用户表不能表示用户和朋友之间的关系(使用单个表可以表示自引用关系)。您将需要一个中间表来实现这一点。下面是一个使用ADO.NET对场景进行建模的示例:
User.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Test" assembly="test">
<class name="User" table="Users">
<id name="Id" column="id">
<generator class="native"/>
</id>
<property name="Name" column="name"/>
<set name="Friends" table="Friends">
<key column="user_id"/>
<many-to-many class="User" column="friend_id"/>
</set>
</class>
</hibernate-mapping>
从上面的映射中,您将注意到以下表格的使用:Users和Friends
下面是代码:
using System;
using System.IO;
using System.Collections.Generic;
using System.Data.SQLite;
using NHibernate;
using NHibernate.Cfg;
using Iesi.Collections.Generic;
namespace Test
{
class Program
{
public static void Main()
{
if (File.Exists("nhibernate.db"))
{
File.Delete("nhibernate.db");
}
ExecuteCommand("create table Users (id integer, name string)");
ExecuteCommand("create table Friends (user_id integer, friend_id string)");
ExecuteCommand("insert into Users (id, name) values (1, 'user1')");
ExecuteCommand("insert into Users (id, name) values (2, 'user2')");
ExecuteCommand("insert into Users (id, name) values (3, 'user3')");
// User1 is friend with User2
ExecuteCommand("insert into Friends (user_id, friend_id) values (1, 2)");
// User1 is friend with User3
ExecuteCommand("insert into Friends (user_id, friend_id) values (1, 3)");
// User2 is friend with User1
ExecuteCommand("insert into Friends (user_id, friend_id) values (2, 1)");
// User3 is friend with User1
ExecuteCommand("insert into Friends (user_id, friend_id) values (3, 1)");
ISessionFactory sessionFactory =
new Configuration().Configure().BuildSessionFactory();
ISession session = sessionFactory.OpenSession();
User user = session.Get<User>(1);
Console.WriteLine(user.Friends.Count);
session.Close();
sessionFactory.Close();
}
private static void ExecuteCommand(string sql)
{
using (SQLiteConnection connection = new SQLiteConnection("Data Source=nhibernate.db;Version=3"))
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
}
class User
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ISet<User> Friends { get; set; }
}
}
使用系统;
使用System.IO;
使用System.Collections.Generic;
使用System.Data.SQLite;
使用NHibernate;
使用NHibernate.Cfg;
使用Iesi.Collections.Generic;
名称空间测试
{
班级计划
{
公共静态void Main()
{
if(File.Exists(“nhibernate.db”))
{
删除(“nhibernate.db”);
}
ExecuteCommand(“创建表用户(id整数,名称字符串)”);
ExecuteCommand(“创建表朋友(用户id整数,朋友id字符串)”);
ExecuteCommand(“插入用户(id、名称)值(1,'user1')”;
ExecuteCommand(“插入用户(id、名称)值(2,'user2')”;
ExecuteCommand(“插入用户(id、名称)值(3,'user3')”;
//User1是User2的朋友
ExecuteCommand(“插入到朋友(用户id,朋友id)值(1,2)”;
//User1是User3的朋友
ExecuteCommand(“插入到朋友(用户id,朋友id)值(1,3)”;
//User2是User1的朋友
ExecuteCommand(“插入朋友(用户id,朋友id)值(2,1)”;
//User3是User1的朋友
ExecuteCommand(“插入朋友(用户id,朋友id)值(3,1)”;
会话工厂会话工厂=
新配置().Configure().BuildSessionFactory();
ISession session=sessionFactory.OpenSession();
User=session.Get(1);
Console.WriteLine(user.Friends.Count);
session.Close();
sessionFactory.Close();
}
私有静态void ExecuteCommand(字符串sql)
{
使用(SQLiteConnection=newsqliteconnection(“数据源=nhibernate.db;版本=3”))
使用(SQLiteCommand=newsqlitecommand(sql,连接))
{
connection.Open();
command.ExecuteNonQuery();
}
}
}
类用户
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟ISet好友{get;set;}
}
}
最后,为了完整起见,这里是我的配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"
/>
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<property name="connection.connection_string">Data Source=nhibernate.db;Version=3</property>
<mapping assembly="test" />
</session-factory>
</hibernate-configuration>
</configuration>
NHibernate.Connection.DriverConnectionProvider
NHibernate.Driver.SQLite20Driver
NHibernate.dialogue.sqlitedialogue
数据源=nhibernate.db;版本=3
有机会在fluent nhibernate?mapping.HasManyToMany(x=>x.Friends).Table(“Friends”).ParentKeyColumn(“UserId”).ChildKeyColumn(“friendsid”);如果一个朋友没有朋友呢?因为这会创建一个外键不为null的结构