2011-10-28 18 views
6

के साथ इकाई फ्रेमवर्क विदेशी कुंजी सम्मिलन मेरे पास 2 संस्थाएं उपयोगकर्ता और उपयोगकर्ता_Profile (एक से एक रिश्ते) हैं। मैंने उन्हें निम्नानुसार जोड़ा है:ऑटो-आईडी

public class User 
{ 
    [Key] 
    [ForeignKey("user_profile")] 
    public int user_id {get;set;} 

    public string username {get;set;} 
    public string email {get;set;} 

    public virtual User_Proile user_profile {get;set;} 
} 


public class User_Profile 
{ 
    [Key] 
    public int user_id {get;set;} 

    public string firstname {get;set;} 
    public string lastname {get;set;} 
} 

user_id SQL सर्वर के उपयोगकर्ता और उपयोगकर्ता_Profile तालिका दोनों में एक पीके है। इसे उपयोगकर्ता तालिका में एक पहचान कॉलम के रूप में भी सेट किया गया है।

जब मैं EFDBContext जोड़ें/SaveChanges के माध्यम से एक नया रिकॉर्ड डालने का प्रयास करता हूं। मुझे निम्न त्रुटि मिलती है: "user_id User_Profile तालिका में पूर्ण नहीं हो सकता है" यह सही समझ में आता है क्योंकि यह एक पीके कॉलम है। मैं उम्मीद कर रहा था कि ईएफ उपयोगकर्ताओं से पहचान उपयोगकर्ता_आईडी लेने में सक्षम होगा और सहेजते समय इसे उपयोगकर्ता_Profile user_id में डालें।

क्या यह संभव है और यदि ऐसा है तो मैं इसे कैसे कार्यान्वित करूं?

अद्यतन: कृपया ध्यान दें कि मैंने मैन्युअल रूप से डीबी टेबल और कोड कक्षाएं बनाई हैं, इसलिए मुझे .edmx फ़ाइल के माध्यम से StoreGeneratedPattern तक पहुंच नहीं है।

उत्तर

7

मुझे लगता है कि यह स्पष्ट रूप से अपने एक-से-एक संबंध कॉन्फ़िगर करने के लिए सुविज्ञ एपीआई का उपयोग आवश्यक है:

public class MyContext : DbContext 
{ 
    // ... your DbSets 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
      .HasRequired(u => u.user_profile) 
      .WithRequiredPrincipal(); 
    } 
} 

और इकाई वर्गों:

public class User 
{ 
    [Key] 
    public int user_id {get;set;} 
    public string username {get;set;} 
    public string email {get;set;} 
    public virtual User_Profile user_profile {get;set;} 
} 

public class User_Profile 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int user_id {get;set;} 
    public string firstname {get;set;} 
    public string lastname {get;set;} 
} 

कक्षाओं में से किसी एक में Identity से None से DatabaseGeneratedOption को बंद करना आवश्यक है। मैंने प्रिंसिपल और आश्रित को बदल दिया है क्योंकि ऐसा लगता है कि User प्रिंसिपल होना चाहिए। [ForeignKey(...)] आवश्यक नहीं है क्योंकि ईएफ user_idUser_Profile में User पर एक एफके संपत्ति के रूप में पहचाना जाएगा।

इस तरह का कोड ...

using (var context = new MyContext()) 
{ 
    var user = new User(); 
    var userProfile = new User_Profile(); 

    user.user_profile = userProfile; 

    context.Users.Add(user); 
    context.SaveChanges(); 
} 

... जैसा कि आप उम्मीद करते हैं तो काम करते हैं और डेटाबेस के लिए दोनों से संबंधित संस्थाओं को बचाने चाहिए।

+0

वाह! यह ठीक उसी तरह काम करता है जैसा आपने कहा था। बहुत धन्यवाद स्लुमा! – chrisg229

0

आप यह बताने के लिए ढांचा पता क्षेत्र डेटाबेस से उत्पन्न होता है अपने .edmx फ़ाइल में StoreGeneratedPatternपहचान लिए विशेषता सेट करना होगा। इस कड़ी में मदद कर सकता है ...

Autonumber with Entity Framework

+1

मैंने अभी एक खोज की है और मेरी ऐप निर्देशिका में कोई .edmx फ़ाइल नहीं है। मैं ईएफ 4 का उपयोग कर रहा हूँ। क्या मैं कुछ भूल रहा हूँ? – chrisg229

+0

उम्म, यह वहां होना चाहिए। .edmx फ़ाइल मूल रूप से आपके द्वारा जेनरेट किया गया मॉडल है, इसलिए उस नाम वाली फ़ाइल की तलाश करें। या आप अपने समाधान एक्सप्लोरर में मॉडल पर राइट क्लिक कर सकते हैं और इसे एक्सएमएल एडिटर के साथ खोल सकते हैं। –

+0

मुझे कोई भी .edmx फ़ाइल नहीं मिल सकती है और मेरे पास मॉडल के पास सबसे नज़दीकी चीज है जो मैंने बनाई गई class.cs फ़ाइलें हैं। कृपया ध्यान दें कि मैंने मैन्युअल रूप से डीबी टेबल और कक्षाएं बनाई हैं (संपत्ति/कॉलम नाम समान बनाते हैं), फिर मैंने बस डीबीसीएन्टेक्स्ट को तुरंत चालू किया और web.config में उचित कनेक्शन बना दिया। उपरोक्त पहचान मुद्दे को छोड़कर सबकुछ बढ़िया लगता है ... – chrisg229