كيفية تعيين nhibernate من الجدول أ إلى الجدول أ نفسه مع العديد من العدد؟

StackOverflow https://stackoverflow.com/questions/401207

  •  03-07-2019
  •  | 
  •  

سؤال

الرجاء المساعدة! لم أستطع معرفة كيفية تعيين الموقف التالي:

لدي جدول واحد فقط.

جدول] المستخدم {id ، الاسم}

صفي يبدو هكذا

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