7

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

मॉडल का यह हिस्सा इस तरह दिखता है:

alt text

मैं जब उपयोगकर्ता तालिका रिकॉर्ड, रिकॉर्ड aspnet_Users मेज पर विदेशी कुंजी वाला डालने विदेशी कुंजी संबंध आवंटित करने के लिए नहीं कर पा रहे ।

An item with the same key has already been added.

कोड मैं कैसी लगती है उपयोग कर रहा हूँ: मैं त्रुटि प्राप्त हो रही

UserAdmin userToAdd = new UserAdmin(); 
... 
userToAdd.aspnet_Users = membershipUser; 
//line above OR line below 
userToAdd.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("ProjectEntities.aspnet_Users", "UserId", membershipUser.UserId); 

db.AddToUsers(userToAdd); 
db.SaveChanges(); 

मुद्दा यह है कि मैं एक नया aspnet_Users तालिका अभिलेख (के लिए रिकॉर्ड जोड़ने के लिए एफई पूछ रहा हूँ है संबंधित प्राथमिक कुंजी तालिका) जब वह रिकॉर्ड पहले से मौजूद है?

मैं एक इकाई के लिए एक विदेशी कुंजी मान कैसे निर्दिष्ट करूं जहां प्राथमिक कुंजी रिकॉर्ड पहले से मौजूद है?

अपडेट किया गया परीक्षण कोड ब्लॉक:

An item with the same key has already been added.

+1

क्या 'सदस्यता उपयोगकर्ता' (उसी) डेटाकॉन्टेक्स्ट द्वारा ट्रैक किया गया है? –

+2

हां सदस्यता यूज़र रिकॉर्ड उसी इकाई मॉडल उदाहरण द्वारा पुनर्प्राप्त किया गया था जिसका उपयोग नए उपयोगकर्ता रिकॉर्ड को करने के लिए किया जा रहा है। – BrooklynDev

उत्तर

8

ठीक है मैंने इसे एक बाहर निकाला। हमेशा की तरह यह सिर्फ मुझे गलती कर रहा था और इसे तुरंत पकड़ नहीं रहा क्योंकि मैं गलत जगह पर देख रहा था।

यह समस्या मेरी तालिका विरासत और डेटाबेस स्तर पर कॉन्फ़िगरेशन के कारण थी। मेरे पास बाल तालिका (UserAdmin) विदेशी कुंजी फ़ील्ड पहचान के रूप में परिभाषित किया गया था, जो तब मेरे मॉडल में StoreGeneratedPattern = Identity के रूप में दिखाई देता था। जब 'ईएफ अपने बच्चे के विदेशी कुंजी क्षेत्र में माता-पिता की प्राथमिक कुंजी का प्रचार करने की कोशिश कर रहा था, तो' उसी कुंजी वाला एक आइटम पहले ही त्रुटि जोड़ा जा चुका है '।

एक बार जब मैंने UserAdmins तालिका से पहचान विनिर्देश हटा दिया तो समस्या दूर हो गई।

समस्या हल हो गई।

2

हाँ कि वास्तव में समस्या है:

MembershipUser membershipUser = Membership.CreateUser("[email protected]", "pass", "[email protected]"); 

Entities db = new Entities(); 
UserAdmin newUser = new UserAdmin(); 
newUser.Name = "blah"; 
newUser.DateAdded = DateTime.Now; 

Guid key = new Guid(membershipUser.ProviderUserKey.ToString()); 
aspnet_Users membershipUserRecord = db.aspnet_Users.Where(u => u.UserId == key).FirstOrDefault(); 
newUser.aspnet_Users = membershipUserRecord; 
//newUser.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("Entities.aspnet_Users", "UserId", membershipUserRecord.UserId); 
db.ObjectStateManager.ChangeObjectState(membershipUserRecord, EntityState.Unchanged); 

db.AddToUsers(newUser); 
db.SaveChanges(); 

इस कोड त्रुटि उत्पन्न करता है। आप सदस्यता उपयोगकर्ता इकाई कैसे प्राप्त किया? यदि आपको वर्तमान ऑब्जेक्ट कॉन्टेक्स्ट ईएफ से यह नहीं मिला है तो यह सोचता है कि यह नया है और यह इसे aspnet_users तालिका में डालने का प्रयास करता है।

ObjectSet करने के लिए उपयोगकर्ता को जोड़ने के बाद इस कोड का उपयोग करने के लिए प्रयास करें:

// db is ObjectContext instance 
db.ObjectStateManager.ChangeObjectState(membershipUser, EntityState.Unchanged); 

thereâ शायद कुछ अन्य तरीकों से कैसे एक ही परिणाम प्राप्त करने के लिए कर रहे हैं, लेकिन यह मेरे लिए काम करता है।

+1

मैंने ChangeObjectState() का उपयोग करने का प्रयास किया लेकिन इसका कोई फायदा नहीं हुआ, फिर भी 'एक ही कुंजी वाला एक आइटम पहले ही जोड़ा जा चुका है' त्रुटि प्राप्त हो रही है। मैंने अपना टेस्ट कोड मूल पोस्ट में देखा है। – BrooklynDev

+0

मैंने आपके कोड की जांच की और इसे काम करना चाहिए। इसके अलावा जब आप ईएफ द्वारा एस्पनेट उपयोगकर्ता का चयन करते हैं तो आपको इसकी स्थिति सेट करने की आवश्यकता नहीं होती है - यह पहले से ही अपरिवर्तित स्थिति में है। क्या उपयोगकर्ता तालिका खाली है? उपयोगकर्ता तालिका में उपयोगकर्ता आईडी स्वचालित उत्पन्न होता है?यदि आप SQL सर्वर का उपयोग करते हैं और यदि आपके पास SQL ​​प्रोफाइलर स्थापित है, तो आप जांच सकते हैं कि SQL आदेशों को निष्पादित किया गया है। –

+0

मैंने डेटाबेस पर एक प्रोफाइल चलाया है और सदस्यता प्रदाता के लिए यह सदस्यता लेने के बाद मुझे कोई सम्मिलित बयान नहीं दिख रहा है। क्रेतेउसर()। SaveChanges() को कॉल करना डेटाबेस के विरुद्ध किसी भी सम्मिलित या अद्यतन कथन निष्पादित नहीं करता है। – BrooklynDev

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

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