2012-04-12 5 views
13

एंटीटी फ्रेमवर्क कोड-पहला दृष्टिकोण का उपयोग करना।किस तरह से कैस्केडिंग डिलीट्स एक-से-कई रिश्ते में जाते हैं?

मान लीजिए मैं दो इकाई श्रेणियां होती हैं:

[Table("Objects")] 
public class DbObject : IValidatableObject 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<DbObjectProperty> Properties { get; set; } 
} 

[Table("ObjectProperties")] 
public class DbObjectProperty 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
    public string Value { get; set; } 

    [Display(Name = "Object"), UIHint("Object")] 
    public long ObjectId { get; set; } 
    public virtual DbObject Object { get; set; } 
} 

अंक यहाँ गौर करने योग्य

  • DbObject केवल एक नेविगेशन संपत्ति है, लेकिन एक विदेशी कुंजी
  • DbObjectProperty के साथ कोई स्तंभ एक नेविगेशन है संपत्ति और एक विदेशी कुंजी
  • I के साथ एक संबंधित कॉलम I टी स्पष्ट होना चाहिए कि यदि मैं किसी ऑब्जेक्ट को हटा देता हूं, तो मैं इसके गुणों को इसके साथ जाना चाहता हूं, लेकिन अगर मैं एक ही संपत्ति हटा देता हूं, तो मैं नहीं चाहता कि पूरी वस्तु गायब हो जाए।

    modelBuilder.Entity<DbObjectProperty>() 
        .HasRequired(op => op.Object) 
        .WithMany(obj => obj.Properties) 
        .HasForeignKey(op => op.ObjectId) 
        .WillCascadeOnDelete(false); 
    
    बेशक

    , इसका मतलब है कोई सोपानी हटाए गए हो जाएगा:

डीबी संदर्भ के लिए OnModelCreating विधि में, अब तक मैं संबंधों को परिभाषित करने के लिए निम्न था। मेरा सवाल है: अगर मैं इसे true में बदलता हूं, तो क्या मैं वही करता हूं जो मैं चाहता हूं? याद रखें कि क्या मैं किसी ऑब्जेक्ट को हटाता हूं, मैं चाहता हूं कि इसकी संपत्तियां इसके साथ जाएं, लेकिन अगर मैं एक ही संपत्ति हटा देता हूं, तो मैं नहीं चाहता कि पूरी वस्तु गायब हो जाए।

DropForeignKey("ObjectProperties", "ObjectId", "Objects"); 
DropIndex("ObjectProperties", new[] { "ObjectId" }); 
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true); 
CreateIndex("ObjectProperties", "ObjectId"); 

मुझे चिंता है कि इस सूचित करते हैं कि एक संपत्ति को हटाने उसके संबंधित वस्तु को नष्ट करेगा लगता हूँ:

इस परिवर्तन (false से true करने के लिए) के लिए स्वत: जनरेट प्रवास कोड यह है। यह होगा?

उत्तर

13

डेटाबेस में किसी रिश्ते की कैस्केडिंग हटाने की दिशा प्रिंसिपल (प्राथमिक/अद्वितीय कुंजी की तालिका) और इस संबंध के आश्रित (विदेशी कुंजी की तालिका) के आधार पर परिभाषित की गई है।

फिर, यदि आप उन सभी आश्रितों को प्रिंसिपल हटाते हैं जिनके पास प्रिंसिपल के प्राथमिक/अद्वितीय कुंजी मान से संबंधित विदेशी कुंजी मान भी हटा दिया जाता है। निर्भर से लेकर प्रिंसिपल तक दिशा में कोई कैस्केडिंग डिलीट नहीं है।

आपके मामले में प्रिंसिपल DbObject है और आश्रित DbObjectProperty है क्योंकि यह विदेशी कुंजी के साथ इकाई/तालिका है।

यह शायद ही कभी कोई मतलब होता है एक व्यापक दूसरी तरह के आसपास हटाना है - विशेष रूप से में एक्स-से-अनेक रिश्ते: यदि आप एक आश्रित (DbObjectProperty) और प्रिंसिपल (DbObject) को हटाते हैं स्वचालित रूप से हटा दिया जाएगा, एक विदेशी कुंजी यदि किसी भी अन्य पर निर्भर होने वाले प्रिंसिपल को रिफ्रेश करने का कोई अन्य निर्भर है तो बाधा का उल्लंघन किया जाएगा।

आपको चिंता करने की आवश्यकता नहीं है।

+0

[धन्यवाद!] (Http://meta.stackexchange.com/questions/700/) – Timwi

+0

अंगूठे का नियम, कैस्केड डिलीट के साथ है, यदि किसी रिकॉर्ड को हटाने से किसी अन्य रिकॉर्ड से विदेशी कुंजी टूट जाती है, तो निर्भर रिकॉर्ड हटा दिया जाता है भी। – orad

+0

तो 'मॉडलबिल्डर। एंटीटी () .हैस्नी (पी => पी। चिल्ड्रेन) .थोन (सी => सी। माता-पिता) 'मॉडलबिल्डर के समान है। एंटीटी () .सॉस (सी => सी। माता-पिता) .थमनी (पी => पी। चिल्ड्रेन) '(वे एक ही रिश्ते को निर्दिष्ट करते हैं)? –

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