2013-01-13 12 views
7

में नया बच्चा बनाता है। मैं डिस्कनेक्ट (संदर्भ से) मोड में एंटीटी फ्रेमवर्क पीओसीओ का उपयोग करना चाहता हूं। मेरे परिदृश्य में मैं एक नई अभिभावक वस्तु बना रहा हूं और इसे मौजूदा बाल वस्तु को संलग्न करना चाहता हूं और फिर इसे डीबी में सहेजना चाहता हूं।
नीचे दिया गया कोड एक नए छात्र रिकॉर्ड को सहेजते समय अवांछनीय रूप से एक नया कोर्स रिकॉर्ड सम्मिलित करता है, जब मैं मौजूदा छात्र रिकॉर्ड को नए छात्र रिकॉर्ड से जोड़ना चाहता हूं।इकाई फ्रेमवर्क: मौजूदा बच्चे पीओसीओ को नए अभिभावक पीओसीओ में जोड़कर, डीबी

मैं इकाई की रूपरेखा जहां ...

  • वस्तुओं संदर्भ से काट दिया जा सकता है में यह कैसे कर सकते। (यानी एक संदर्भ में पूछे गए और फिर एक अलग संदर्भ में सहेजा गया)
  • मुझे डीबी से बाल रिकॉर्ड को फिर से पूछने की आवश्यकता नहीं है, इसलिए जब मैं डीबी में सहेज रहा हूं तो मैं इसे माता-पिता से जोड़ सकता हूं। मैं वास्तव में डीबी के लिए अतिरिक्त यात्रा करने से बचना चाहता हूं जब मेरे पास पहले से ही स्मृति में एक वस्तु के रूप में है।

यह पृष्ठ एक डेटाबेस आरेख कि नीचे दिए गए कोड पर http://entityframeworktutorial.net/EF4_EnvSetup.aspx#.UPMZ4m-UN9Y

class Program 
{ 
    static void Main(string[] args) 
    { 

     //get existing course from db as disconnected object 
     var course = Program.getCourse(); 

     //create new student 
     var stud = new Student(); 
     stud.StudentName = "bob"; 

     //assign existing course to the student 
     stud.Courses.Add(course); 

     //save student to db 
     using (SchoolDBEntities ctx = new SchoolDBEntities()) 
     { 
      ctx.Students.AddObject(stud); 
      ctx.SaveChanges(); 
     } 
    } 

    static Course getCourse() 
    { 
     Course returnCourse = null; 

     using (var ctx = new SchoolDBEntities()) 
     { 
      ctx.ContextOptions.LazyLoadingEnabled = false; 
      returnCourse = (from s in ctx.Courses 
          select s).SingleOrDefault(); 
     } 

     return returnCourse; 
    } 
} 

उत्तर

17

मेरा मानना ​​है कि इसे पूरा करने के कुछ तरीके हैं। ,

ctx.Entry(course).State = EntityState.Unchanged; 

या हिदायत अपने संदर्भ है कि आप मौजूदा इकाई के साथ काम कर रहे हैं: आप निर्दिष्ट कर सकते कि पाठ्यक्रम इकाई नहीं बल्कि जोड़ा से अपरिवर्तित है, इन पंक्तियों के साथ

ctx.Courses.Attach(course); 

अधिक यहाँ जानकारी: http://msdn.microsoft.com/en-us/data/jj592676.aspx

संपादित

मेरे समाधान से कुछ चलने वाले नमूने हैं, मैंने सत्यापित किया है कि वे अपेक्षित काम करते हैं। सभी मामलों में हमारे पास आईडी = 2 और नाम = "एडिसन वेस्ले" के साथ डेटाबेस में प्रकाशक रिकॉर्ड है (उदाहरण के लिए अप्रासंगिक, लेकिन केवल अच्छे उपाय के लिए)।

दृष्टिकोण 1 - संलग्न का उपयोग करते हुए विधि

using (var context = new Context()) 
{ 
    var book = new Book(); 
    book.Name = "Service Design Patterns";     
    book.Publisher = new Publisher() { Id = 2 }; // Only ID is required 
    context.Publishers.Attach(book.Publisher); 
    context.Books.Add(book); 
    context.SaveChanges(); 
} 

दृष्टिकोण 3 - - स्थापना विदेशी कुंजी मूल्य

using (var context = new Context()) 
{ 
    var book = new Book(); 
    book.Name = "Service Design Patterns"; 
    book.PublisherId = 2; 
    context.Books.Add(book); 
    context.SaveChanges(); 
} 
इकाई राज्य

using (var context = new Context()) 
{ 
    var book = new Book(); 
    book.Name = "Service Design Patterns"; 
    book.Publisher = new Publisher() {Id = 2 }; // Only ID is required 
    context.Entry(book.Publisher).State = EntityState.Unchanged; 
    context.Books.Add(book); 
    context.SaveChanges(); 
} 

दृष्टिकोण 2 की स्थापना

यह पिछले दृष्टिकोण काम करने के लिए मैं अतिरिक्त संपत्ति PublisherId जोड़ने के लिए की जरूरत है, यह NavigationPropertyName + 'ईद के अनुसार नाम हो गया है "सम्मेलन auotmatically एफई से ही उठाए जा रहे हैं: मैं यहाँ EF5 कोड का उपयोग कर रहा

public int PublisherId { get; set; } 
public Publisher Publisher { get; set; } 

सबसे पहले, लेकिन यह पीओसीओ के समान है।

+0

दूसरा विकल्प लगभग काम करता है, लेकिन मुझे "ऑब्जेक्ट संलग्न नहीं किया जा सकता क्योंकि यह ऑब्जेक्ट संदर्भ में पहले से ही है।" "ctx.Students.AddObject (स्टड) पर त्रुटि;" लाइन। मुझे लगता है कि मैं अभी भी "stud.Courses.Add (कोर्स) कर रहा हूं, जबकि मैं ऐसा नहीं कर सकता;" इससे पहले । मैं अभी भी स्टड ऑब्जेक्ट में पाठ्यक्रम संग्रह का उपयोग करना चाहता हूं। – MakkyNZ

+0

ठीक है, मेरे पास इसका परीक्षण करने के लिए कोई समाधान आसान नहीं है, लेकिन इसे पहले संलग्न करने का प्रयास करें, और उसके बाद इसे छात्र में जोड़ें। उम्मीद है कि इस तरह इसे ईएफ द्वारा "जोड़ा गया" के रूप में चिह्नित नहीं किया जाएगा। –

+0

जो वास्तव में आदर्श नहीं है। मैं अभिभावक-> बाल संबंध पहले किसी ऑब्जेक्ट स्तर पर हो रहा हूं, क्योंकि यह अभी तक डीबी में सहेजने के लिए तैयार नहीं हो सकता है। हो सकता है कि मुझे केवल उन संस्थाओं के बीच सभी रिश्तों को हटा देना चाहिए जो ईएफ उत्पन्न करता है और मैन्युअल रूप से इसे नियंत्रित करता है? – MakkyNZ

0

इकाई की रूपरेखा आधारित है रिश्तों कि संदर्भों पार की अनुमति नहीं है पता चलता है।

यदि आप कोर्स का पठन करते हैं और छात्र को उसी कथन का उपयोग करके छात्र से जोड़ते हैं, तो यह काम करेगा।

0

मैंने दूसरे विकल्प की कोशिश की जो उसने मेरे लिए काम किया। मैंने माता-पिता की तरह-> बच्चे के रिश्ते पहले किसी ऑब्जेक्ट स्तर पर हो रहा था और डीबी में सहेजा था। शायद मुझे उन संस्थाओं के बीच सभी रिश्तों को हटा देना चाहिए जो ईएफ उत्पन्न करता है और मैन्युअल रूप से इसे नियंत्रित करता है।