2010-01-22 9 views
5

के साथ त्रुटि के लिए "कोई दृढ़ता नहीं" मैं Nhibernate 2.1.2.4000 GA का उपयोग Nhibernate.Linq 1.0 और FluentNhibernate का नवीनतम संस्करण github पर मास्टर से डाउनलोड किया गया है।NHibernate, NHibernate.Linq और Fluent मैपिंग

इम कुछ परीक्षण कर रहे हैं और जब भी मैं एक इकाई एक LINQ क्वेरी मैं इस त्रुटि हो रही द्वारा प्राप्त हटाने का प्रयास:

No persister for: NHibernate.Linq.Query`1[[Employees.Core.Entities.Employee, Employees.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

सभी अन्य कार्यों (डालने, अद्यतन और चुनें) ठीक लग रहा है;

मेरे इकाई वर्ग:

public class Employee 
{ 
    public Employee() 
    { 
    } 

    public virtual Int32 Id { get; private set; } 
    public virtual String Name { get; set; }  

    public virtual String SayHello() 
    { 
     return String.Format("'Hello World!', said {0}.", Name); 
    } 
} 

मानचित्रण वर्ग:

public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name) 
      .Not.Nullable() 
      .Length(50); 
    } 
} 

विन्यास:

Assembly mappingsAssemly = Assembly.GetExecutingAssembly(); 

return Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2008 
        .ConnectionString(connectionString) 
        .ProxyFactoryFactory(typeof(ProxyFactoryFactory)) 
        .ShowSql())        
    .Mappings(m => m.FluentMappings.AddFromAssembly(mappingsAssemly)) 
    .BuildSessionFactory(); 

और कोड वह काम नहीं करता:

public void RemoveAll() 
{ 
    var q = from employee in _session.Linq<Employee>() 
      select employee; 

    foreach (var employee in q.ToList()) 
    { 
     _session.Delete(q); 
    } 
} 

कोई विचार?

+1

+1 अत्यंत अच्छी तरह से लिखा सवाल! –

उत्तर

4

हम सब यह याद किया!

क्षमा करें लोग और अपने सभी सहायता के लिए धन्यवाद, लेकिन मैं तो बस लगा।

आप विधि RemoveAll() पर ध्यान देना तो आपको लगता है कि मैं "q" वस्तु जो एक इकाई नहीं है हटाने का प्रयास करते देखेंगे, लेकिन बजाय "कर्मचारी" गुजर का एक IQueriable। यह ध्यान की कमी थी।

सही कोड होगा:

 
     public void RemoveAll() 
     { 
      var q = from employee in _session.Linq() 
        select employee; 

      var p = q.ToList(); 

      foreach (var employee in p) 
      { 
       _session.Delete(employee); 
      } 
     } 
+0

बहुत अच्छा आपने अपना जवाब पोस्ट किया है, इसलिए यह एनएच मिस-उपयोग के लिए पिघला देता है ... –

1

यह सिर्फ LINQ प्रदाता में एक बग हो सकता है। आप नवीनतम एनएचबर्ननेट ट्रंक के खिलाफ समस्या को पुन: उत्पन्न करने का प्रयास कर सकते हैं जिसमें एक नया/अलग लिंक प्रदाता शामिल है। वैकल्पिक रूप से, अगर आप (सफलतापूर्वक) धाराप्रवाह NHibernate समीकरण से हटा दें, तो आप शायद (अपेक्षाकृत आसानी से) LINQ प्रदाता के खिलाफ एक टेस्ट केस/बग रिपोर्ट प्रस्तुत कर सकते हैं।

2

आप कुछ विधानसभा आप FNH (Assembly.GetExecutingAssembly()) वास्तव में एक अपने मैपिंग युक्त है करने के लिए ही उपलब्ध करा रहे हैं?

को ExportTo विधि शामिल करने के लिए कॉल करें, जो किसी भी मैपिंग को निर्यात करेगा FNH किसी निर्दिष्ट फ़ोल्डर को पाता है; उस फ़ोल्डर की सामग्री देखें और देखें कि सभी मैपिंग वहां हैं या नहीं। यदि वे हैं, तो संभावना है कि यह एक एफएनएच मुद्दा नहीं है और यह लिंक प्रदाता के साथ एक समस्या हो सकती है (जैसा कि माइकल ने कहा था)।

Mappings(
    m => m.FluentMappings 
      .AddFromAssembly(mappingsAssemly) 
      .ExportTo(@"C:\")); 

एक और चीज जिसे आप जांच सकते हैं वह एनएचबीर्नेट कॉन्फ़िगरेशन उदाहरण है जो एनएच वास्तव में उपयोग कर रहा है। ऐसा करने के लिए, BuildSessionFactory के बजाय BuildConfiguration का उपयोग करें और परिणाम का निरीक्षण; ClassMappings संग्रह (या उसमें कुछ बदलाव) है, जिसमें सभी मैप किए गए इकाइयां होनी चाहिए।

यदि यह ठीक दिखता है, तो इसके बजाय मानदंड API या HQL का उपयोग करके अपनी क्वेरी बनाने का प्रयास करें, देखें कि क्या यह आपकी समस्या को हल करता है (और उस स्थिति में यह लगभग निश्चित रूप से linq प्रदाता होना है)।

+0

+1 यह FluentNH के लिए एक बहुत अच्छा सामान्यीकृत समस्या निवारण विकी पेज बना देगा, अगर यह पहले से नहीं है! –

संबंधित मुद्दे