2015-10-19 10 views
6

से पहले प्रविष्टि के पीके के साथ प्रविष्टि नहीं बना सकता है, मैं इकाई फ्रेमवर्क 6 और SQLite डेटाबेस (System.Data.SQLite.EF6) का उपयोग कर रहा हूं, लेकिन मैं एक ही प्राथमिक कुंजी के साथ एक प्रविष्टि नहीं बना सकता इसे हटाने के तुरंत बाद।इकाई फ्रेमवर्क 6 और SQLite -

संस्था की मेरे मॉडल:

public class Person 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 

    public int Name { get; set; } 
} 

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

1) मैं (व्यक्तियों की मेरी तालिका में इस इकाई PERSON1 के कहने सम्मिलित आईडी = 1) के साथ।

using (var context = new MyDbContext()) 
{ 
    context.Create(person1); 
    await context.SaveChangesAsync(); 
} 

2) Afters कुछ टोम मैं के साथ पूरे व्यक्तियों मेज साफ:

using (var context = new MyDbContext()) 
{ 
    await context.Database.ExecuteSqlCommandAsync(string.Format("DELETE FROM `PersonModels`")); 
    await context.SaveChangesAsync(); 
} 

3) मैं 1 कदम से प्रविष्टि के रूप में ही प्राथमिक कुंजी के साथ प्रविष्टि जोड़ने के लिए प्रयास करें: PERSON2 (आईडी के साथ = 1)

using (var context = new MyDbContext()) 
{ 
    context.Create(person2); 
    await context.SaveChangesAsync(); 
} 

लेकिन 3 चरण में, SaveChangesAsync()

के साथ विफल 10

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

जब मैं (विभिन्न प्राथमिक कुंजी के साथ) तालिका समाशोधन और फिर 1 कदम से प्रविष्टि जोड़ने के बाद कुछ अन्य प्रविष्टि जोड़ने के लिए, यह ठीक काम करता है और दोनों प्रविष्टियों अपवाद के बिना सहेजे जाते हैं।

मैंने एक नई प्रविष्टि बनाने के पहले सीधे एक ब्रेकपॉइंट जोड़ा (तालिका साफ़ होने के बाद) और बाह्य उपकरण और तालिका द्वारा व्यक्ति तालिका को चेक किया गया है (इसलिए आईडी = 1 के साथ कोई प्रविष्टि नहीं है)।

अद्यतन: विस्तारित DbContexte + मेरी बनाएं विधि के क्रियान्वयन:

public DbSet<PersonModel> Persons { get; set; } 

    public T Create<T>(T entity) 
     where T : class 
    { 
     try 
     { 
      GetDbSetForType<T>().Add(entity); 
      return entity; 
     } 
     catch (Exception ex) 
     { 
      return default(T); 
     } 
    } 

    private DbSet<T> GetDbSetForType<T>() 
     where T : class 
    { 
     var type = typeof(T); 

     if (type == typeof(PersonModel)) return Persons as DbSet<T>; 
     //...my other types 
     throw new Exception("Type not found in db"); 
    }  
+0

संदर्भ। बनाएं (व्यक्ति 2) - क्या यह आपकी अपनी विधि है? क्योंकि मुझे याद नहीं है कि ईएफ में यह है। यदि हां - तो क्या आप इसे दिखा सकते हैं? – Toddams

+0

@Toddams ओह, क्षमा करें, मैंने –

+0

पर मेरी निर्माण विधि का बॉडी जोड़ा है यदि आप PersonModels से सभी प्रविष्टियों को हटाते हैं, तो आप इसके बजाय इसका उपयोग कर सकते हैं: 'प्रतीक्षा का इंतजार करें। डाटाबेस.एक्सक्यूट एसक्यूएल कॉमांडएसिंक (स्ट्रिंग.फॉर्मैट (" ट्रंकेट टेबल 'पर्सनल मॉडल्स' ")); 'क्या यह आपके लिए काम करेगा? – LocEngineer

उत्तर

0

एफई डेटाबेस संदर्भों वस्तुओं है कि यह डेटाबेस में स्मृति जब तक इसे नष्ट कर दिया या उतार दिया जाता है से लिया गया की एक सूची बनाए रखें।

using (var ctx = new MyDbContext()) 
{ 
    var person1 = new Person { Id = 1 }; 
    ctx.Persons.Add(person1); 
    await ctx.SaveChangesAsync(); 

    await context.Database.ExecuteSqlCommandAsync(string.Format("DELETE FROM `PersonModels`")); 

    // This is the secret 
    ((IObjectContextAdapter)ctx).ObjectContext.Detach(person1); 

    ctx.Persons.Add(person1) 
    await ctx.SaveChangesAsync(); 

} 
+0

धन्यवाद, लेकिन मैं अलग-अलग संदर्भों का उपयोग कर रहा हूं (जब मैं व्यक्ति तालिका को साफ़ करता हूं, तो मैं संदर्भ का निपटान करता हूं और प्रविष्टि जोड़ने के लिए संदर्भ का एक नया उदाहरण बनाता हूं)। इसके अलावा, मेरा ((IObjectContextAdapter) ctx)। ऑब्जेक्ट कॉन्टेक्स्ट में "व्यक्ति" नहीं है (मेरे पास केवल डीबीकॉन्टेक्स्ट -> 'डीबीसेट व्यक्तियों के कार्यान्वयन में व्यक्तियों की संपत्ति है, लेकिन डीबीसेट में डिटेच() नहीं है।) –

+0

I निश्चित रूप से वर्णित परिस्थितियों में समस्या को पुन: उत्पन्न नहीं कर सका। मैंने 'डिटेच' कोड नमूना भी अपडेट किया है। –

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