문제

도와주세요! 다음 상황을 매핑하는 방법을 알 수 없었습니다.

나는 단지 1 개의 테이블이 있습니다.

표] 사용자 {id, name}

내 수업은 이렇게 보인다

public class User
{
  public int Id { get; set; }
  public string Name { get; set; }

  public ISet<User> Friends { get; set; }
}

각 사용자는 다른 사용자와 관계가 있습니다. 예를 들어, 사용자는 다른 사용자 인 많은 친구를 가질 수 있습니다.

이것에 대한 매핑은 무엇입니까? 나는 이것이 다수의 관계 여야한다고 생각하지만 HBM이 어떻게 보이는지 모르겠습니까?

감사,

도움이 되었습니까?

해결책

나는 이것이 다수의 관계 여야한다고 생각합니다

당신이 올바른지. 시나리오에서는 자기 참조 적 다수의 매핑을 사용해야합니다. 그러나 단일 사용 사용자 테이블 당신은 사이의 관계를 나타낼 수 없습니다 사용자 그리고 친구들 (단일 테이블을 사용하면 자기 참조를 나타낼 수 있습니다. 부모-자식 관계). 이를 달성하려면 중개 테이블이 필요합니다. 다음은 사용하는 예입니다 sqlite 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>

위의 매핑에서 다음 테이블의 사용을 알 수 있습니다.

코드는 다음과 같습니다.

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; }
    }
}

그리고 마지막으로 완전성을 위해 여기에 내 구성 파일이 있습니다.

<?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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top