2010-08-27 13 views
6

परिदृश्य से संबद्ध था: परिदृश्य: मेरे पास आलसी लोडिंग सक्षम के साथ एक ग्राहक वस्तु है। मैं सूची कार्यक्रम के लिए ग्राहक की एक सूची को कॉल करने के लिए पूरे कार्यक्रम में इसका उपयोग करता हूं। इसमें Division_Customer_Rel, Division_Email_Rel और Email_Address ऑब्जेक्ट्स के साथ संबंध हैं। रिश्तों के सभी बंद Lazy = true, Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Inverse = true है।समान पहचानकर्ता वाला एक अलग ऑब्जेक्ट पहले से ही सत्र त्रुटि

समस्या: जब मैं एक नया सत्र का उपयोग कर रहा हूँ और मैं कोशिश करते हैं और बचाने के लिए यह मुझे त्रुटि A different object with same identifier was already associated with the session देता है। मैंने कॉलक में अन्य ऑब्जेक्ट्स में शामिल होने से नए सत्र का उपयोग किये बिना सूची वापस करने के लिए LINQ का उपयोग करने का प्रयास किया है, लेकिन मुझे यकीन नहीं है कि सक्रिय होने पर ActiveRecordLinq <> का उपयोग कैसे करें।

private Customer GetCustomer() 
    { 
     return (from x in ActiveRecordLinq.AsQueryable<Customer>() 
     where x.Customer_ID == ((Customer)lst_customers.SelectedItem).Customer_ID 
     select x).First(); 
    } 

कोड कि त्रुटि पैदा करता

using (new SessionScope()) 
       { 
       //var sess = GetSession(); 
       //var customer = 
       // sess.CreateCriteria<Customer>("c").CreateCriteria("c.DivisionCustomer_Rels").List<Customer>(). 
       //  First(); 
       var customer = GetCustomer(); 
        /* Ensure user wishes to commit the data. */ 

        var result = 
         MessageBox.Show(
          @"You are about to submit changes to customer: " + customer.CustomerName + @"." + 
          Environment.NewLine + Environment.NewLine + 
          @"Submit Changes?", @"Submit Customer Changes", MessageBoxButtons.YesNo, 
          MessageBoxIcon.Question); 
        if (result == DialogResult.Yes) 
        { 
         customer.CustomerName = txt_custName.Text; 
         customer.NamcisNumber = Convert.ToInt32(txt_namcis.Text); 
         customer.DCA = chk_dca.Checked; 
         customer.CustomerType = (CustomerType_Code) cmb_custType.SelectedItem; 
         customer.AOR = (AOR_Code) cmbAOR.SelectedItem; 
         customer.CSRep = (CSRep_Code) cmbCSRep.SelectedItem; 
         customer.DivisionCustomer_Rels.Clear(); 
         foreach (var t in lst_SectorCust.Items) 
         { 
          customer.DivisionCustomer_Rels.Add(new Division_Customer_Rel 
                    { 
                     Customer = customer 
                     , 
                     Division = (Division_Code) t, 
                     MarkedForDeletion = false 
                    }); 
         } 
         customer.CircuitCustomer_Rels.Clear(); 
         foreach (var t in lst_Circuit.Items) 
         { 
          customer.CircuitCustomer_Rels.Add(new Circuit_Customer_Rel 
                    { 
                     Circuit = (Circuit) t, 
                     Customer = customer, 
                     MarkedForDeletion = false 
                    }); 
         } 
         customer.EmailAddresses.Clear(); 
         foreach (var t in lst_email.Items) 
         { 
          var temp = (Email_Address)t; 
          temp.Customer = customer; 
          customer.EmailAddresses.Add(temp); 

         } 
         ////Need to manage the emails this way otherwise we recieve an error because of lazy loading 
         //foreach (var temp in lst_email.Items.Cast<Email_Address>()) 
         //{ 
         // temp.Customer = customer; 
         // if (!customer.EmailAddresses.Any(s=>temp.ToString().Equals(s.ToString())) && !customer.EmailAddresses.Contains(temp)) 
         // { 
         //  customer.EmailAddresses.Add(temp); 
         // } 

         //} 

         //var text = IList<Email_Address> lst_email.Items; 
         //var tem = customer.EmailAddresses.Except(lst_email.Items); 
         //for (var i = customer.EmailAddresses.Count - 1; i >= 0;i--) 
         //{ 
         // var temp = customer.EmailAddresses[i]; 

         // for (var j = 0; j < lst_email.Items.Count; j++) 
         // { 
         //  if (temp.ToString()!=lst_email.Items[j].ToString()) 
         //  { 
         //   customer.EmailAddresses.Remove(temp); 
         //  } 
         // } 
         //} 
         customer.DivisionEmail_Rels.Clear(); 
         customer.Save(); 
         MessageBox.Show(@"Changes submitted."); 
        } 
        //SessionScope.Current 
       } 

ईमेल एड्रेस कक्षा

namespace Sens 
{ 
    using System; 
    using System.Collections.Generic; 
    using Castle.ActiveRecord; 

    [Serializable, ActiveRecord("dbo.Email_Address")] 
    public class Email_Address : ActiveRecordValidationBase<Email_Address> 
    { 
     #region Constructors 

     public Email_Address() 
     { 
      DivisionEmail_Rels = new List<Division_Email_Rel>(); 
     } 

     #endregion 

     #region Properties 

     [PrimaryKey(Column = "Email_ID")] 
// ReSharper disable InconsistentNaming 
     public int Email_ID { get; private set; } 

     [BelongsTo(Column = "Customer_ID")] 
     public Customer Customer { get; set; } 

     [Property(Column = "[Email]", NotNull = true, Length = 100)] 
     public string Email { get; set; } 

     [BelongsTo(Column = "EmailType_ID")] 
     public EmailType_Code EmailType { get; set; } 

     [Property(Column = "[ReceivesSENS]", NotNull = true)] 
     public bool ReceivesSENS { get; set; } 

     [Property(Column = "[MarkedForDeletion]", NotNull = true)] 
     public bool MarkedForDeletion { get; set; } 

     #endregion 

     #region HasMany DivisionEmail_Rels 

     [HasMany(typeof(Division_Email_Rel), Lazy = false,Cascade=ManyRelationCascadeEnum.AllDeleteOrphan,Inverse=true)] 
     public IList<Division_Email_Rel> DivisionEmail_Rels { get; set; } 

     #endregion 
    } 
} 

डिवीजन ग्राहक Rel

namespace Sens 
{ 
    using System; 
    using Castle.ActiveRecord; 

    [Serializable, ActiveRecord("dbo.Division_Customer_Rel")] 
    public class Division_Customer_Rel : ActiveRecordValidationBase<Division_Customer_Rel> 
    { 
     #region Constructors 

     #endregion 

     #region Properties 

     [PrimaryKey(Column = "Relationship_ID")] 
// ReSharper disable InconsistentNaming 
     public int Relationship_ID { get; private set; } 
// ReSharper restore InconsistentNaming 

     [BelongsTo(Column = "Customer_ID")] 
     public Customer Customer { get; set; } 

     [BelongsTo(Column = "Division_ID")] 
     public Division_Code Division { get; set; } 

     [Property(Column = "[MarkedForDeletion]", NotNull = true)] 
     public bool MarkedForDeletion { get; set; } 

     #endregion 
    } 
} 

डिवीजन ईमेल Rel

#region namespace imports 

using System; 
using Castle.ActiveRecord; 

#endregion 

namespace Sens 
{ 
    [Serializable, ActiveRecord("dbo.Division_Email_Rel")] 
    public class Division_Email_Rel : ActiveRecordValidationBase<Division_Email_Rel> 
    { 
     #region Constructors 

     #endregion 

     #region Properties 

     [PrimaryKey(Column = "Relationship_ID")] 
// ReSharper disable InconsistentNaming 
      public int Relationship_ID { get; private set; } 

// ReSharper restore InconsistentNaming 

     [BelongsTo(Column = "Email_ID", Cascade = CascadeEnum.All)] 
     public Email_Address Email { get; set; } 

     [BelongsTo(Column = "Division_ID")] 
     public Division_Code Division { get; set; } 

     [BelongsTo(Column = "Customer_ID")] 
     public Customer Customer { get; set; } 

     [Property(Column = "[MarkedForDeletion]", NotNull = true)] 
     public bool MarkedForDeletion { get; set; } 

     #endregion 
    } 
} 
+0

1. LINQ से SQL को क्या करना है? यह एक पूरी तरह से अलग पुस्तकालय है। 2. क्या आप उस कोड को पोस्ट कर सकते हैं जो फेंकता है "एक ही पहचानकर्ता के साथ एक अलग वस्तु पहले ही सत्र से जुड़ी हुई थी"? –

+0

क्या आप डिवीजन_Customer_Rel, Division_Email_Rel और Email_Address कक्षाओं के लिए भी कोड पोस्ट कर सकते हैं? –

+0

@ मॉरिसियो शेफ़र मैं सोमवार को कोड पोस्ट करूंगा (कार्य संबंधित) – Gage

उत्तर

3

जिस तरह से मुझे जवाब देने के लिए हर जगह गुगल करने के बाद इसे सहेजने का तरीका था, उन्हें ईमेल करने के बजाय ईमेल_एड्रेस को साफ़ करना था।

SessionScope.Current.Evict(customer.EmailAddresses); 
         foreach (var t in lst_email.Items) 
         { 
          var temp = (Email_Address)t; 
          temp.Customer = customer; 
          customer.EmailAddresses.Add(temp); 

         } 

सुनिश्चित नहीं हैं कि क्यों इस हालांकि काम किया, अगर किसी को समझा सकता है कि बहुत अच्छा होगा। मैं इसे यहां पोस्ट कर रहा हूं ताकि उम्मीद है कि यह अगले व्यक्ति को इस त्रुटि का सामना करने के लिए कुछ समय बचाएगा।

1

बेदखल NHBernate प्रथम स्तर कैश से उस विशिष्ट "ईमेल_एड्रेस" संदर्भ को हटा देता है।

ग्राहक से। ईमेल मेल पता है कि आपने NHBernate प्रथम स्तर कैश में सभी ईमेल पते को हटा दिया है।

फिर आप lst_email में ईमेल की सूची से आइटम प्राप्त कर रहे हैं और उन्हें नई ऑब्जेक्ट के रूप में ग्राहक के लिए ईमेल एड्रेस में जोड़ रहे हैं।

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

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