سؤال

كمبتدئين على Nibernate (2.1.0)، أحاول إنشاء اختبار الوحدة الأولى باستخدام قاعدة بيانات Northwind الشهيرة. يذهب الاختبار مثل هذا (يمكن العثور على ملفات التكوين في نهاية هذا السؤال):

ISessionFactory sessionFactory=new Configuration().BuildSessionFactory();
ISession session=sessionFactory.OpenSession();
IList<Customer> list=session.CreateCriteria<Customer>().List<Customer>();
Assert.AreEqual(91, list.Count);

المشكلة هي list.Count هو دائما 0.

  • لقد حاولت فتح الجلسة من خلال تزويدها IDbConnection, ، على SQL Server 2008، MS Access و Sqlite (أنا إيجابي 100٪ متأكد من أن إعدادات قاعدة البيانات والاتصالات صالحة) دون جدوى.
  • لقد حاولت إجراء عرض SQL الذي تم إنشاؤه على نافذة الإخراج VS2008 (انظر ملفات التكوين في أسفل هذا المنشور) ولكن لا شيء يظهر أبدا.

لا يمكنني إلا أن أخمن في هذه المرحلة أن تكويني غير صحيح، لكن ليس لدي أي فكرة عن كيفية إصلاحه.


  • app.config. :

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
      <session-factory>
        <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
        <property name="connection.connection_string">Data Source=S:\Work\SVN\src\Northwind\SQL\Northwind.db</property>
        <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
        <property name="show_sql">true</property>
      </session-factory>
    </hibernate-configuration>
    <log4net>
      <appender name="DebugSQL" type="log4net.Appender.TraceAppender">
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
      </appender>
      <root>
        <level value="DEBUG" />
        <appender-ref ref="DebugSQL" />
      </root>
    </log4net>
    
  • customer.cs. :

    namespace Northwind.DomainModel.NHibernate
    {
        public class Customer
        {
            public string CustomerID { get; set; }
            public string CompanyName { get; set; }
            public string ContactName { get; set; }
            public string ContactTitle { get; set; }
            public string Address { get; set; }
            public string City { get; set; }
            public string Region { get; set; }
            public string PostalCode { get; set; }
            public string Country { get; set; }
            public string Phone { get; set; }
            public string Fax { get; set; }
        }
    }
    
  • customer.hbm.xml. :

    <hibernate-mapping
      xmlns="urn:nhibernate-mapping-2.2"
      assembly="Northwind.DomainModel"
      namespace="Northwind.DomainModel.NHibernate"
    >
      <class name="Customer" table="Customers">
        <id name="CustomerID" column="CustomerID" type="String" length="5">
          <generator class="assigned" />
        </id>
        <property name="CompanyName" />
        <property name="ContactName" />
        <property name="ContactTitle" />
        <property name="Address" />
        <property name="City" />
        <property name="Region" />
        <property name="PostalCode" />
        <property name="Country" />
        <property name="Phone" />
        <property name="Fax" />
      </class>
    </hibernate-mapping> 
    
هل كانت مفيدة؟

المحلول 3

دققت المسمار فيه !

يحدث ذلك أردت أن ألعبه ذكيا ولديه ملف تعيين XML كإعالة لملف CS. في هذه الحالة، يبدو أن المورد المضمن تحمل اسم الفصل الأول الموجود في ملف CS بدلا من اسم ملف XML. صورة من المفترض أنها تساوي ألف كلمة:Solution and Assembly

لذلك كتبت هذا للحصول عليه للعمل:

ISessionFactory sessionFactory=new Configuration()
    .Configure()
    .AddResource(typeof(Customer).FullName, typeof(Customer).Assembly)
    .BuildSessionFactory();

الدروس المستفادة في الحصول عليها للعمل:

  • لن يشكو Thhibernate بأي شكل من الأشكال عند محاولة استخدام فئة مع عدم وجود رسم خرائط معروفة. لست متأكدا من أنني سأتصل بهذه الميزة ...
  • قبل فتح جلسة بنفسك IDbConnection, ، افتح الاتصال نفسه.
  • تتعلم أكثر مما تنوي عند محاولة لعب الذكية ؛-)

نصائح أخرى

خطوتي الأولى لاستكشاف الأخطاء وإصلاحها من شأنها أن تسأل ما يتم إنشاؤه بواسطة مكالمتك ثم حاول تشغيل ذلك ضد DB المستهدف ومعرفة النتائج التي تحصل عليها

قد تحتاج إلى تغيير الملحق الخاص بك إلى Aflender وحدة التحكم بدلا من التتبع.

شيئين تحتاج إلى الاتصال بالتكوين على كائن التكوين الخاص بك مثل هذا:

   
Configuration configuration = new Configuration().Configure();

يتوقع هذا ملف يدعى Hibernate.cfg.xml في نفس الدليل. هناك طريقة أخرى يمكنك الاتصال لتحديد اسم ملف التكوين إذا كان لديك اسم آخر.

ثانيا، تحتاج إلى إخبار Nhibernate حيث لتحميل ملفات التعيين، والتي تجميعها قبل إنشاء المصنع


configuration.AddAssembly(typeof(Customer).Assembly); //if in same assembly with  customer class

أخيرا يجب أن يكون جميع أعضاء فئة العميل الخاصة بك ظاهريا، لا يمكنك استخدام التحميل الكسول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top