Wie NHibernate aus Tabelle A Tabelle A selbst mit many-to-many abzubilden?
-
03-07-2019 - |
Frage
Bitte um Hilfe! Ich konnte es nicht herausfinden, wie die folgende Situation abzubilden:
Ich habe nur 1 Tabelle.
[Tabelle] Benutzer {id, name}
Meine Klasse sieht wie folgt aus
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public ISet<User> Friends { get; set; }
}
Jeder Benutzer hat Beziehung mit anderen Benutzern. e.g.'User A‘viele Freunde hat, die anderen Nutzer sind.
Was soll die Zuordnung für das sein? Ich denke, das sollte Beziehung Many-to-Many sein, aber ich weiß nicht wirklich, wie die HBM aussehen wird?
Danke,
Lösung
ich denke, das sollte Many-to-Many Beziehung
Sie sind richtig. In Ihrem Szenario müssen Sie ein selbstbezüglicher many-to-many-Mapping verwenden. Aber mit einem einzigen Nutzer Tabelle können Sie nicht repräsentieren die Beziehung zwischen Benutzer und Freunde (unter Verwendung eines einzigen Tabelle Sie eine selbstbezüglicher Eltern-Kind-Beziehung ). Sie werden eine Zwischentabelle benötigen, dies zu erreichen. Hier ist ein Beispiel unter Verwendung von SQLite ADO.NET Anbieter der Modellierung Ihr Szenario eine mögliche Art und Weise zu zeigen:
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>
Aus der obigen Abbildung können Sie die Verwendung der folgenden Tabellen bemerken: Benutzer und Freunde
Und hier ist der Code:
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; }
}
}
Und schließlich der Vollständigkeit halber hier ist meine Config-Datei:
<?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>