2009-11-08 13 views
7

मैं नॉर्थविंड डेटाबेस का उपयोग इस पोस्ट के लिए एक उदाहरण के रूप में कर रहा हूं जहां मुझे अलग-अलग इकाइयों को इकाई ढांचे का उपयोग करके डेटाबेस में वापस सहेजने में समस्या आ रही है।इकाई फ्रेमवर्क - अलग राज्य में संबंधित वस्तुओं में परिवर्तन सहेजना

मैं निम्नलिखित दो तरीकों मुझे प्रदेशों और क्षेत्रों प्राप्त करने के लिए:

static List<Region> GetRegions() 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Region.MergeOption = System.Data.Objects.MergeOption.NoTracking; 
      return entities.Region.ToList(); 
     } 
    } 

    static List<Territories> GetTerritories() 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 
      return entities.Territories.ToList(); 
     } 
    } 

इन विधियों दोनों काम ठीक है और मुझे वस्तुओं मैं अलग राज्य में आवश्यकता के संग्रह मिलता है।

मैं भी एक स्थिर विधि, जो दोनों एक पुरानी इकाई और वर्तमान में उसे संपादित इकाई में ले जाता है SaveEntity कहा जाता है इस प्रकार है के रूप में:

static void SaveEntity(EntityObject oldEntity, EntityObject newEntity) 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Attach(oldEntity); 
      entities.ApplyPropertyChanges(newEntity.EntityKey.EntitySetName, newEntity); 
      entities.SaveChanges(); 
     } 
    } 

इस विधि आंशिक रूप से काम करता है जहां किसी चीज़ के लिए बदलाव सहेजे गए हैं डेटाबेस के नीचे, लेकिन संबंधित वस्तुओं के संबंध में कोई भी परिवर्तन सहेजा नहीं जाता है।

मैं निम्नलिखित कोड मेरे उदाहरण के रूप में उपरोक्त विधि बुला है

  List<Territories> territories = GetTerritories(); 
     List<Region> regions = GetRegions(); 

     Region region = regions.Where(n => n.RegionID == 2).FirstOrDefault(); 
     Territories oldTerritory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault(); 
     Territories newTerritory = ObjectCopier.Clone<Territories>(oldTerritory); 

     newTerritory.TerritoryDescription = "Hello World"; 
     newTerritory.Region = region; 

     SaveEntity(oldTerritory, newTerritory); 

TerritoryDescription करने के लिए परिवर्तन सफलतापूर्वक सहेजा जाता है, लेकिन क्षेत्र के लिए परिवर्तन नहीं है, डेटाबेस में यह अभी भी रूप में regionId = 1 रहता है RegionID = 2 के बजाय।

क्या कोई मुझे कुछ अंतर्दृष्टि प्रदान कर सकता है कि क्यों लागूप्रॉपर्टी चेंज संबंधित वस्तुओं में परिवर्तन का प्रचार नहीं करता है?

इसके अलावा, क्या किसी को पता है कि मैं इस समस्या के आसपास कैसे हो सकता हूं?

उत्तर

1

मुझे लगता है कि आप यहां जवाब पा सकते हैं (एलेक्स जेम्स बेहतर है)। Entity Framework Updating with Related Entity

असल में, कारण यह है कि ईएफ संबंधों में वस्तुएं भी होती हैं और संस्थाओं (हटाए गए, जोड़े गए ...) जैसी स्थितियां होती हैं, इसलिए आपको संदर्भ में मूल संदर्भ मान भी होना चाहिए।

2

क्षेत्रों और क्षेत्रों को अलग-अलग लाने के बजाय, दोनों को एक ही प्रश्न में लाएं। कुछ ऐसा (मुझे लगता है कि आप इकाई को अपडेट करना चाहते हैं, एक नया बनाना नहीं चाहते हैं);

static List<Region> GetTerritoriesWithRegions() 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 
      return entities.Territories.Include("Region").ToList(); 
     } 
    } 

फिर उन्हें निम्न के रूप में अपडेट करें;

List<Territories> territoriesWithRegions = GetTerritoriesWithRegions(); 
     Territories territory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault(); 
     territory.TerritoryDescription = "Hello World"; 
     Region region = territories.Where(p => p.Any(q => q.Region.RegionID == 2)).FirstOrDefault().Region; 
     territory.Region = region; 

     SaveEntity(territory); 

और उन्हें बचाएं;

static void SaveEntity(EntityObject entity) 
    { 
     using (NorthwindEntities entities = new NorthwindEntities()) 
     { 
      entities.Attach(entity); 
      entities.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);    
      entities.SaveChanges(); 
     } 
    } 

मैंने नोटपैड पर इसे कोड किया है इसलिए गलतियां हो सकती हैं; अगर कोई टिप्पणी करें तो मैं तदनुसार अपडेट करूंगा।

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