2011-06-06 6 views
28

मेरी वर्तमान परियोजना एंटिटी फ्रैमवर्क कोड-प्रथम पर आधारित है। मेरे पास तीन प्रकार हैं: कार्य, कार्य प्रकार और मॉड्यूल।इकाई फ्रेमवर्क उन लोगों का उपयोग करने के बजाय विदेशी कुंजी ऑब्जेक्ट बनाता है जो पहले से ही उपलब्ध हैं

public class Task 
    { 
     public int ID { get; set; } 
     public Module Module { get; set; } 
     public TaskType Type { get; set; } 
    } 

    public class TaskType 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 

    public class Module 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 

कार्य-प्रकार के लिए तालिका के अंदर परिभाषित विदेशी कुंजी संबंध हैं।

मेरी समस्या यह है कि जब मैं पहले से उपलब्ध टास्कटाइप और मॉड्यूल ऑब्जेक्ट्स (आईडी = 1) से जुड़ा नया टास्क-ऑब्जेक्ट बनाने का प्रयास करता हूं, तो उन ऑब्जेक्ट्स को उनकी संबंधित तालिकाओं में नई पंक्तियों के रूप में बनाया जाता है।

 TaskRepository repo = new TaskRepository(); 

     Task task = new Task(); 
     task.Module = Modules.SingleOrDefault(m => m.ID == 1); 
     task.Type = TaskTypes.SingleOrDefault(t => t.ID == 1); 

     Tasks.Add(task); 

यह रूप में अच्छी तरह बस पहले से ही उपलब्ध TaskType-आईडी और मॉड्यूल-आईडी का उपयोग कर के बजाय मेरी TaskType-तालिका में और मेरे मॉड्यूल-तालिका में एक नया पंक्ति बनाता है।

मुझे आशा है कि मैं यह स्पष्ट कर दिया कि मेरी समस्या ;-) है

आपकी मदद के लिए अग्रिम धन्यवाद। मैं इसकी सराहना करता हूं।

सादर, केविन

+1

क्या आप 'मॉड्यूल' और 'टास्क टाइप' लोड करने और 'कार्य' को सहेजने के लिए एक ही संदर्भ उदाहरण का उपयोग कर रहे हैं? –

+0

नहीं, मुझे मॉड्यूल और टास्कटाइप को अन्य वर्ग के अंदर सहायक पद्धतियों का उपयोग करके प्राप्त होता है जो फिर से मेरे डीबीकॉन्टेक्स्ट का एक उदाहरण रखता है। – bitfrickler

उत्तर

58

आप संबंधित निकाय लोड करना उसी संदर्भ उदाहरण उपयोग नहीं करते हैं तो आप बस उसे नई इकाई को नहीं जोड़ सकते हैं और उम्मीद करते हैं कि डेटाबेस में मौजूदा रिकॉर्ड इस्तेमाल किया जाएगा। नया संदर्भ यह नहीं जानता कि डेटाबेस में ये उदाहरण मौजूद हैं - आपको इसे संदर्भ में कहना होगा।

समाधान:

  1. उपयोग दोनों लोड हो रहा है संबंधित संस्थाओं के लिए एक ही संदर्भ और बचत नई इकाई
  2. संबंधित संस्थाओं लोड न करें और पहली संदर्भ से डमी वस्तुओं
  3. लोड संस्थाओं का उपयोग करें और उन्हें अलग , इकाइयों को एक नए संदर्भ में संलग्न करें और उसके बाद उन्हें एक नई इकाई को असाइन करें।
  4. मैन्युअल 1 के लिए करने के लिए Unchanged

उदाहरण Added से संबंधों की स्थिति बदलने के संबंधों के साथ एक नई इकाई को जोड़ने के बाद:

var module = context.Modules.SingleOrDefault(m => m.ID == 1); 
var taskType = context.TaskTypes.SingleOrDefault(t => t.ID == 1); 

Task task = new Task(); 
task.Module = module; 
task.Type = taskType; 

context.Tasks.Add(task); 

2 के लिए उदाहरण:

var module = new Module { Id = 1 }; 
var taskType = new TaskType { Id = 1 }; 

context.Modules.Attach(module); 
context.TaskTypes.Attach(taskType); 

Task task = new Task(); 
task.Module = module; 
task.Type = taskType; 

context.Tasks.Add(task); 

के लिए 3 उदाहरण :

var module = otherContext.Modules.SingleOrDefault(m => m.ID == 1); 
otherContext.Entry(module).State = EntityState.Detached; 

var taskType = otherContext.TaskTypes.SingleOrDefault(t => t.ID == 1); 
otherContext.Entry(taskType).State = EntityState.Detached; 

context.Modules.Attach(module); 
context.TaskTypes.Attach(taskType); 

Task task = new Task(); 
task.Module = module; 
task.Type = taskType; 

context.Tasks.Add(task); 
012 4 के लिए

उदाहरण:

var module = otherContext.Modules.SingleOrDefault(m => m.ID == 1); 
otherContext.Entry(module).State = EntityState.Detached; 

var taskType = otherContext.TaskTypes.SingleOrDefault(t => t.ID == 1); 
otherContext.Entry(taskType).State = EntityState.Detached; 

Task task = new Task(); 
task.Module = module; 
task.Type = taskType; 

context.Tasks.Add(task); 

context.Entry(module).State = EntityState.Unchanged; 
context.Entry(taskType).State = EntityState.Unchanged; 
+2

वाह, यह कुछ शानदार जवाब है :-) बहुत बहुत धन्यवाद। मुझे लगता है कि मैं # 3 ले जाऊंगा ... – bitfrickler

+0

उसी संदर्भ का उपयोग करने और उसी संदर्भ के समान उदाहरण का उपयोग करने की आवश्यकता है। वह महत्वपूर्ण है। –

5

मैं इकाई की रूपरेखा के लिए नया हूँ, लेकिन मैं सिर्फ एक ही मुद्दा है, जहां मेरे विदेशी कुंजी संपत्ति बसा हुआ था में भाग लेकिन नेविगेशन वस्तु अशक्त था, की तरह कोड के साथ:

:
public class EntryRecord 
{   
    [Key] 
    public int Id { get; set; } 
} 
public class QueueItem 
{  
    [Key] 
    public int Id { get; set; } 


    public int EntryRecordId { get; set; } 

    [ForeignKey("EntryRecordId")] 
    public EntryRecord EntryRecord { get; set;} 

}

आभासी फिक्स करने के लिए समस्या नेविगेशन गुण को सेट और आलसी लोड हो रहा है सक्षम बनाता है 210

[ForeignKey("EntryRecordId")] 
    public virtual EntryRecord EntryRecord { get; set;} 
संबंधित मुद्दे