2017-02-27 6 views
9

से विवादित है, मैं एक हरा एएसपीनेट डेवलपर हूं और मैं अपनी परियोजना के साथ नवीनतम इकाई ढांचे का उपयोग कर रहा हूं। मुझे अपने डेटाबेस को स्वत: उत्पन्न मूल्यों (मुझे लगता है) के साथ बीजिंग करने में कोई समस्या है। यहां सही त्रुटि है।INSERT कथन फोरगिन कुंजी बाधा

enter image description here

कोड यह रहा:

public class Address 
{ 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int AddressId { get; set; } 
// some more properties 
} 

public class ApplicationUser : IdentityUser 
{ 
     [ForeignKey("Address")]   
    public int AddressId { get; set; } 
    public Address Address { get; set; } 

// some more properties 
} 

public class Shelter 
{ 
     [Required] 
     [ForeignKey("Address")] 
     public int AddressId { get; set; } 
     public Address Address { get; set; } 
// some more properties 
} 
//seed 
private void CreateShelters() 
{ 
    EntityEntry<Address> MspcaAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "350 S Huntington Ave", 
       City = "Jamaica Plain", 
       State = "MA", 
       AreaCode = "02130", 
       Latitude = 42.3228928, 
       Longititude = -71.11120540000002 
    }); 
    EntityEntry<Address> BostonAnimalCareAndControlAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "26 Mahler Rd", 
       City = "Roslindale", 
       State = "MA", 
       AreaCode = "02131", 
       Latitude = 42.2943377, 
       Longititude = -71.12153390000003 
      }); 
      EntityEntry<Address> AnimalRescueLeagueOfBostonAddress = DbContext.Addresses.Add(new Address() 
      { 
       Street = "10 Chandler St", 
       City = "Boston", 
       State = "MA", 
       AreaCode = "0S2116", 
       Latitude = 42.3470486, 
       Longititude = -71.06976929999996 
      }); 

      EntityEntry<Shelter> Mspca = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "MCSPA", 
       AddressId = MspcaAddress.Entity.AddressId 
      }); 
      EntityEntry<Shelter> BostonAnimalCareAndControl = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Boston Animal Care And Control", 
       AddressId = BostonAnimalCareAndControlAddress.Entity.AddressId 
      }); 
      EntityEntry<Shelter> AnimalRescueLeagueOfBoston = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Animal Rescue League Of Boston Address", 
       AddressId = AnimalRescueLeagueOfBostonAddress.Entity.AddressId 
      }); 
      DbContext.SaveChanges(); 
    } 

मैं डेटाबेस पुनः यदि असंगत डेटा/तालिकाओं के साथ एक मुद्दा था देखने के लिए करने की कोशिश की लेकिन मैं अभी भी त्रुटि हो रही है। कोई विचार?

+2

एक उपहार देने से सवाल बेहतर नहीं होता है। अनुवर्ती टिप्पणियों से बचने के लिए आपको अभी भी [mcve] प्रदान करने की आवश्यकता है * मुझे अभी भी त्रुटि मिल रही है ... *। चूंकि अपवाद संदेश स्पष्ट रूप से इंगित करता है कि समस्या प्रदान किए गए कोड में नहीं है (हालांकि अधिकतर इसकी एक ही समस्या है), लेकिन 'एप्लिकेशन यूज़र' डालने वाले कोड में। –

+0

आपके द्वारा प्रदान किया गया कोड डेटाबेस में नया 'एप्लिकेशन यूज़र' नहीं जोड़ता है, जबकि त्रुटि कहती है कि 'एप्लिकेशन यूज़र' के लिए विदेशी कुंजी का उल्लंघन किया जाता है। क्या आप वाकई डीबगिंग और एक ही कोड साझा कर रहे हैं। कृपया पोस्ट कोड को सही कोड पोस्ट करें, यदि यह समान नहीं है। –

उत्तर

4

आपकी "Shelter" संस्थाएं, जिन्हें आप बीज की कोशिश कर रहे हैं, की आवश्यकता है कि आप मौजूदा AddressID सबमिट करें, ऊपर दिए गए कोड को उस पते का पता प्राप्त करने का प्रयास किया गया है जो अभी तक नहीं बनाया गया है।

आप पहली बार (DbContext.SaveChanges(); का प्रयोग करके) डेटाबेस को अपने पते कमिट चाहिए

उसके बाद, आप पुनः प्राप्त AddressId साथ शेल्टर संस्थाओं बना सकते हैं। नीचे दिया गया कोड नमूना दिखाता है कि आप यह कैसे कर सकते हैं, लेकिन आपको पता लाने वाले प्रश्नों को दोबारा लिखना पड़ सकता है। या, आपको उन्हें पूरी तरह से सम्मिलित प्रक्रिया से अलग करना पड़ सकता है।

private void CreateShelters() 
{ 
    EntityEntry<Address> MspcaAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "350 S Huntington Ave", 
       City = "Jamaica Plain", 
       State = "MA", 
       AreaCode = "02130", 
       Latitude = 42.3228928, 
       Longititude = -71.11120540000002 
    }); 
    EntityEntry<Address> BostonAnimalCareAndControlAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "26 Mahler Rd", 
       City = "Roslindale", 
       State = "MA", 
       AreaCode = "02131", 
       Latitude = 42.2943377, 
       Longititude = -71.12153390000003 
      }); 
      EntityEntry<Address> AnimalRescueLeagueOfBostonAddress = DbContext.Addresses.Add(new Address() 
      { 
       Street = "10 Chandler St", 
       City = "Boston", 
       State = "MA", 
       AreaCode = "0S2116", 
       Latitude = 42.3470486, 
       Longititude = -71.06976929999996 
      }); 

    DbContext.SaveChanges(); 


      EntityEntry<Shelter> Mspca = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "MCSPA", 
       AddressId = MspcaAddress.Entity.AddressId 
      }); 
      EntityEntry<Shelter> BostonAnimalCareAndControl = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Boston Animal Care And Control", 
       AddressId = DbContext.Addresses.Where(x => x.Street == "26 Mahler Rd").FirstOrDefault().AddressId 
     }); 
      EntityEntry<Shelter> AnimalRescueLeagueOfBoston = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Animal Rescue League Of Boston Address", 
       AddressId = DbContext.Addresses.Where(x => x.Street == "10 Chandler St").FirstOrDefault().AddressId 

      }); 
      DbContext.SaveChanges(); 
    } 

आशा है कि यह आपके लिए जाने के लिए पर्याप्त है। यदि पते के लिए प्रश्न ID काम नहीं करते हैं तो मुझे बताएं और मुझे उन लोगों के साथ आपकी सहायता करने में खुशी होगी।

+0

बताए गए संचालन को अलग करता है लेकिन मुझे एक ही त्रुटि मिल रही है। 'माइक्रोसॉफ्ट.इन्टिटीफ्रेमवर्ककोर.डीबी अपडेट अपवाद: प्रविष्टियों को अपडेट करते समय एक त्रुटि हुई। विवरण के लिए आंतरिक अपवाद देखें। ---> सिस्टम। डेटा। SQL क्लाइंट।SqlException: INSERT कथन विदेशी कुंजी बाधा "FK_ApplicationUser_Address_AddressId" से विवादित है। यह संघर्ष डेटाबेस में हुआ "WalkFred-12340be6-0442-4622-b782-a7412bb7d321", तालिका "dbo.Address", कॉलम 'पता आईडी'। – user664509

+0

मैंने एक मान्य पता आईडी को पुनर्प्राप्त करने के नमूने के साथ कोड संपादित किया है। आप सही पता – DaniDev

+0

प्राप्त करने के लिए इसके साथ टिंकर कर सकते हैं मैंने अपनी परियोजना को कॉपी और पेस्ट किया है और मुझे एक ही त्रुटि मिल रही है। – user664509

2

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

आप कोड का सार (यानी संपत्ति कार्य बाहर छोड़ रहा है, संक्षिप्तता के लिए) इस तरह दिखना चाहिए:

var mspcaAddress = new Address(); 
var bostonAnimalCareAndControlAddress = new Address(); 
var animalRescueLeagueOfBostonAddress = new Address(); 
context.Addresses.AddRange(new[] 
{ 
    mspcaAddress, 
    bostonAnimalCareAndControlAddress, 
    animalRescueLeagueOfBostonAddress 
}); 

var mspca = new Shelter() 
{ 
    Address = mspcaAddress 
}; 
var bostonAnimalCareAndControl = new Shelter() 
{ 
    Address = bostonAnimalCareAndControlAddress 
}; 
var animalRescueLeagueOfBoston = new Shelter() 
{ 
    Address = animalRescueLeagueOfBostonAddress 
}; 
context.Shelters.AddRange(new[] 
{ 
    mspca, 
    bostonAnimalCareAndControl, 
    animalRescueLeagueOfBoston 
}); 
context.SaveChanges(); 

त्रुटि आपको बताएंगे कि ApplicationUser में एक AddressId पर लागू होता है, मैं में एक समान दृष्टिकोण लगता है ApplicationUser एस बनाने से समस्या हल हो जाएगी।

वैसे, आप पहले context.Addresses.AddRange कथन के बिना कर सकते हैं। आश्रयों को जोड़कर पते जोड़े जाएंगे।

ध्यान दें कि मैंने कोड से EntityEntry एस भी हटा दिया है। मुझे लगता है कि वे कोड को अनिवार्य रूप से जटिल करते हैं। आपको केवल उन साधारण वस्तुओं की आवश्यकता है जिन्हें आप बना रहे हैं।

+1

बस रिकॉर्ड के लिए, मैंने आपके जवाब को वोट नहीं दिया। मैंने वास्तव में इसे कल देखा और मुझे यह पसंद है! (यह मानते हुए कि यह काम करता है, जिसे मैंने परीक्षण नहीं किया है)। बीटीडब्ल्यू, आप यह भी नहीं दिखाते कि पता फ़ील्ड कैसे बीज करें। कोई बड़ा सौदा नहीं है लेकिन उनमें से कुछ की आवश्यकता हो सकती है (शून्य नहीं)। – DaniDev

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