2012-06-27 21 views
8

इकाई फ्रेमवर्क कोड का उपयोग करते समय पहले 4.3.1 1-से-1 की बहुतायत के साथ संबंध बनाना संभव है। यही है, रिश्ते के प्रत्येक छोर पर एक इकाई।इकाई फ्रेमवर्क कोड पहला वन-टू-वन आवश्यक-आवश्यक रिश्ते

यह^आवश्यक आवश्यक या आवश्यक-वैकल्पिक होने के लिए 1 से 1 रिश्तों कॉन्फ़िगर करने के लिए संभव है। हालांकि, जब मैं दोनों के बीच स्विच करता हूं तो मुझे कोई अंतर नहीं दिखता है:

  • डेटाबेस स्कीमा जेनरेट किया गया। मैं SQL सर्वर 2008 को लक्षित कर रहा हूं।
  • ईएफ का रनटाइम व्यवहार।

इस तरह के रूप में, मैं के रूप में आवश्यक आवश्यक कॉन्फ़िगर किया गया जा रहा है संबंध के बावजूद एक इसी RequiredDependentAs रिकॉर्ड के बिना एक RequiredPrincipalAs रिकॉर्ड बनाने के लिए, कर रहा हूँ।

इस इकाई प्रकार से एक आवश्यक संबंध को कॉन्फ़िगर करता है: यह HasRequired (...) के लिए दस्तावेज़ खंडन करने के लिए लगता है। इकाई प्रकार के उदाहरण तब तक डेटाबेस में सहेजे नहीं जा पाएंगे जब तक कि यह संबंध निर्दिष्ट न हो। डेटाबेस में विदेशी कुंजी गैर-शून्य होगी।

http://msdn.microsoft.com/en-us/library/gg671317

आवश्यक आवश्यक संबंध संस्थाओं:

public class RequiredPrincipalA 
{ 
    public int Id { get; set; } 
    public virtual RequiredDependentA DependentA { get; set; } 
} 

public class RequiredDependentA 
{ 
    public int Id { get; set; } 
    public virtual RequiredPrincipalA PrincipalA { get; set; } 
} 

आवश्यक-वैकल्पिक संबंध संस्थाओं:

public class RequiredPrincipalB 
{ 
    public int Id { get; set; } 
    public virtual OptionalDependentB DependentB { get; set; } 
} 

public class OptionalDependentB 
{ 
    public int Id { get; set; } 
    public virtual RequiredPrincipalB PrincipalB { get; set; } 
} 

DbContext और मॉडल conf iguration:

public class AppContext : DbContext 
{ 
    public DbSet<RequiredPrincipalA> PrincipalAs { get; set; } 
    public DbSet<RequiredDependentA> DependentAs { get; set; } 

    public DbSet<RequiredPrincipalB> PrincipalBs { get; set; } 
    public DbSet<OptionalDependentB> DependentBs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<RequiredPrincipalA>() 
      .HasRequired(o => o.DependentA) 
      .WithRequiredPrincipal(o => o.PrincipalA); 

     modelBuilder.Entity<RequiredPrincipalB>() 
      .HasOptional(o => o.DependentB) 
      .WithRequired(o => o.PrincipalB); 
    } 
} 

परीक्षण कोड:

Database.SetInitializer(new DropCreateDatabaseAlways<AppContext>()); 

using (var ctx = new AppContext()) 
{ 
    ctx.Database.Initialize(force: false); 

    ctx.PrincipalAs.Add(new RequiredPrincipalA()); 
    ctx.PrincipalBs.Add(new RequiredPrincipalB()); 

    ctx.SaveChanges(); 
} 

मुझे पता है मैं की नेविगेशन गुण के लिए एक [आवश्यक] डेटा विशेषता जोड़ सकता हूँ RequiredPrincipalA.DependentA और RequiredDependentA.PrincipalA । यह उपरोक्त परिदृश्य को रोकने के लिए ईएफ सत्यापन का कारण बन जाएगा। हालांकि, मैं ऐसा नहीं करना चाहता क्योंकि यह मौजूदा इकाई को अद्यतन करते समय नेविगेशन प्रॉपर्टी को भी पॉप्युलेट किया जाता है। इसका मतलब है कि आवेदन को प्रत्येक अद्यतन के लिए रिश्ते के दूसरे छोर पर इकाई को पूर्व-प्राप्त करना होगा।

क्यों बस जब के बीच एक रिश्ता बदल रहा है के लिए आवश्यक आवश्यक और आवश्यक-वैकल्पिक मैं नहीं एफई के व्यवहार में कोई अंतर दिखाई देता है?

^ध्यान दें कि वैकल्पिक-वैकल्पिक भी समर्थित है लेकिन यह मेरे प्रश्न का हिस्सा नहीं है। एक वैकल्पिक-वैकल्पिक संबंध कॉन्फ़िगर किए जाने पर उत्पन्न डेटाबेस स्कीमा और रनटाइम व्यवहार में स्पष्ट अंतर हैं।

उत्तर

13

मुझे नहीं पता कि इस मामले के लिए आवश्यक क्यों आवश्यक है लेकिन यह डेटाबेस में मौजूद नहीं है क्योंकि प्राथमिक कुंजी पर संबंध बनाया गया है। आवश्यक-आवश्यक मतलब है कि यदि संबंधित बी मौजूद नहीं है तो बी को सम्मिलित नहीं किया जा सकता है और यदि संबंधित ए मौजूद नहीं है तो बी को सम्मिलित नहीं किया जा सकता है => न तो ए या बी डाला जा सकता है।

डाटाबेस संबंध हमेशा प्राचार्य और निर्भर इकाई है - प्रिंसिपल निर्भर बिना हमेशा मौजूद कर सकते हैं।

रियल एफई में आवश्यक आवश्यक प्राप्त किया जा सकता है केवल जब दोनों ए और बी एक ही तालिका (table splitting), क्योंकि इस तरह के मामले में वे दोनों एक डालने कमांड के साथ डाला हैं पर मैप किए जाते।

+0

अपने जवाब के लिए धन्यवाद। यह निश्चित रूप से मेरे प्रश्न के डेटाबेस स्कीमा पहलू को स्पष्ट करता है। हालांकि, मैं समझने में बहुत उत्सुक हूं कि ईएफ में कोई स्पष्ट व्यवहार परिवर्तन क्यों नहीं है। –

+0

क्या यह आवश्यक हो सकता है-आवश्यक है क्योंकि इसे ईएफ द्वारा लागू रनटाइम किया जा सकता है, भले ही यह एसक्यूएल में इस बाधा को लागू करना संभव नहीं है? –

+0

ल्यूक, तथ्य यह है कि आर/आर और आर/ओ को कॉन्फ़िगर करते समय स्कीमा में कोई अंतर नहीं है अब लाडस्लावा के जवाब के लिए धन्यवाद। बिंदु अब यह है कि प्रलेखन राज्यों के बावजूद आर/आर रनटाइम पर ईएफ द्वारा लागू नहीं होता प्रतीत होता है। –

5

नहीं वास्तव में एक जवाब है, लेकिन मैं और अधिक से अधिक टिप्पणियों में फिट होगा कहना है। लेकिन आप जानते हैं, मैं 900 पेज की किताबें लिखता हूं ... यह सिर्फ मैं कैसे रोल करता हूं। :)

अजीब तरह मैं धाराप्रवाह विन्यास डेटा टिप्पणी के रूप में एक ही तरह से व्यवहार करने की उम्मीद है और उलझन में है कि यह ऐसा नहीं कर रहा है कर रहा हूँ जाएगा। (मैंने रोवन मिलर को अपनी प्रतिक्रिया प्राप्त करने के लिए इस धागे के लिंक के साथ पिंग किया है।) और मेरा मतलब यह है कि: SaveChanges के दौरान बाधा को मान्य करना। संबंधित संस्थाओं की कुंजियों का उपयोग 1:

डेटाबेस तरफ, मैं Ladislav.In साथ हूँ मॉडल, एफई को परिभाषित करता है 1। लेकिन डेटाबेस में, आपके पास दोनों टेबलों में एफके नहीं हो सकते हैं, इसलिए डेटाबेस में केवल निर्भर तालिका को उस बाधा की आवश्यकता होगी कि यह मूल तालिका में मौजूदा पीके के लिए पीके मानचित्र है।

और अंत में, मैं चाहता एफई संबंध लागू करने के लिए यदि आप हमेशा तेह पूर्ण ग्राफ से निपटने के लिए नहीं जा रहे हैं नहीं के लिए अपने कारण को समझते हैं। मुझे लगता है कि 1: 1 संबंध ईएफ रिलेशनशिप मैपिंग का सबसे भ्रमित हैं और मुझे हमेशा नियमों की अनुस्मारक और चीजों को कैसे काम करना चाहिए, के लिए खुद को वापस जाना पड़ता है।

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