2013-05-10 3 views
5

मेरे पास विदेशी कुंजी के साथ एक से एक संबंध है लेकिन Cascade Delete किसी कारण से सक्षम नहीं है। नमूना कोड नीचे है।कोड पहले एक-से-एक सक्षम कैस्केड

public class AppRegistration 
{ 
    public int AppRegistrationId { get; set; } 
    [Required] 
    [StringLength(50)] 
    [Display(Name = "Username")] 
    public string UserName { get; set; } 
    [Required] 
    [StringLength(100)] 
    public string Password { get; set; } 
    [StringLength(20)] 
    public string StudentOrAgent { get; set; } 
    // navigation properties 
    public virtual AppStatus AppStatus { get; set; } 
    public virtual Agreement Agreement { get; set; } 
    public virtual AnotherTable AnotherTable { get; set; } 
} 

विदेशी कुंजी के साथ निर्भर तालिका नीचे है।

public class Agreement 
{ 
    [Key] 
    [ForeignKey("AppRegistration")] 
    public int AppRegistrationId { get; set; } 
    public DateTime DateAgreed { get; set; } 
    public virtual AppRegistration AppRegistration { get; set; } 
} 

जब मैं उत्पन्न AppRegistrations तालिका से किसी प्रविष्टि को हटाने का प्रयास मैं एक संदर्भ बाधा संघर्ष मिलता है।

मैं निर्भर तालिका में नेविगेशन संपत्ति पर [Required] डालने की कोशिश की, लेकिन यह कुछ भी नहीं है - Update-Database आदेश No pending code-based migrations. संदेश दिखाता है। कोई विचार? धन्यवाद।

अद्यतन: मैं निम्न त्रुटि संदेश हो रही है:

The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.AppStatus_dbo.AppRegistrations_AppRegistrationId". The conflict occurred in database "MVCapp", table "dbo.AppStatus", column 'AppRegistrationId'.

उत्तर

8

मैं एक अलग नमूना परियोजना में cascade delete समस्या बाहर काम करने का निर्णय लिया: Fluent एपीआई का उपयोग कर। मुझे निम्नलिखित ब्लॉग & एमएसडीएन पेज बहुत उपयोगी पाए गए।

Code First दृष्टिकोण का उपयोग करते हुए मॉडल के अनुसार तैयार करते।

public class Category 
{ 
    public int CategoryId { get; set; } 
    public string CategoryName { get; set; } 
    public virtual Book Book { get; set; } 
} 
public class Book 
{ 
    public int CategoryId { get; set; } 
    public string BookTitle { get; set; } 
    public string BookAuthor { get; set; } 
    public string BookISBN { get; set; } 
    public virtual Category Category { get; set; } 
} 

(मुझे पता है इकाई के नाम एक-से-अनेक संबंध का सुझाव है, लेकिन मैं शीर्ष पर, 1 से 1 संबंध मॉडल करने के लिए कोशिश कर रहा हूँ मेरे मूल प्रश्न में के रूप में।)

तो, उपर्युक्त मॉडल में प्रत्येक श्रेणी में केवल एक पुस्तक हो सकती है।

आपके DbContext में - श्रेणीबद्ध वर्ग निम्न जोड़ें।

यह ठीक से 1 से 1 संबंध बनाता है:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

    modelBuilder.Entity<Book>() 
     .HasKey(t => t.CategoryId); 

    modelBuilder.Entity<Category>() 
     .HasRequired(t => t.Book) 
     .WithRequiredPrincipal(t => t.Category) 
     .WillCascadeOnDelete(true); 
} 

(, System.Data.EntitySystem.Data.Entity.ModelConfiguration.Conventions निम्नलिखित नामस्थान ऊपर कोड के लिए आवश्यक हैं।)।ON DELETE CASCADE सक्षम के साथ आपके पास प्रत्येक तालिका में प्राथमिक कुंजी होगी और Book तालिका में एक विदेशी कुंजी भी सक्षम होगी।

Database Diagram for the model

उपरोक्त कोड में, Category इकाई पर मैं WithRequiredPrincipal()इस्तेमाल कियाt => t.Category तर्क है, जहां तर्क निर्भर तालिका में विदेशी कुंजी स्तंभ है के साथ।

आप बिना WithRequiredPrincipal()एक तर्क का उपयोग करते हैं आप Book तालिका में एक अतिरिक्त स्तंभ प्राप्त होगा और आप Category तालिका में CategoryId करने के लिए Book मेज की ओर इशारा करते में दो विदेशी कुंजी होगा।

मुझे आशा है कि यह जानकारी मदद करेगी।

अद्यतन

बाद में मैं सीधे यहाँ जवाब मिला:

http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired

5

एक कारण है कि आप नहीं मिल रहे हैं को नष्ट व्यापक है, क्योंकि अपने रिश्ते वैकल्पिक है। (व्यापक स्वचालित रूप से कॉन्फ़िगर किया गया हटाना)

यदि आप चाहते हैं का संबंध काफी AppRegistration यानी आवश्यक एक Agreement आप उपयोग कर सकते हैं करने के लिए है:

public class Agreement 
{ 
    ... 
    [Required] 
    public AppRegistration AppRegistration{ get; set; } 
} 

आप संबंध व्यापक साथ वैकल्पिक होना चाहते हैं हटाना आप इस कॉन्फ़िगर कर सकते हैं

modelBuilder.Entity<AppRegistration>() 
    .HasOptional(a => a.Agreement) 
    .WithOptionalDependent() 
    .WillCascadeOnDelete(true); 
+0

जवाब के लिए धन्यवाद। मैंने '[आवश्यक]' डालने का प्रयास किया लेकिन कोड-माइग्रेशन का 'अपडेट-डाटाबेस' रिटर्न 'कोई लंबित कोड-आधारित माइग्रेशन नहीं है।' इस के आसपास जाने का कोई तरीका? – erdinger

+1

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि आप पहली तकनीक का प्रयास नहीं करना चाहेंगे, क्योंकि दोनों दिशाओं में एक-एक-एक रिश्ते को पूरा करना लगभग असंभव है। यदि आप अनुबंध सम्मिलित करने का प्रयास करते हैं, तो आपको बाधा उल्लंघन मिलेगा क्योंकि AppRegistration मौजूद नहीं है, और इसके विपरीत। – AaronLS

+0

@ user2291748 क्या आपने अपडेट-डेटाबेस चलाने से पहले माइग्रेशन जोड़ा था? हारून एलएस, हम्म शायद आप सही हैं, यह सिर्फ कुछ ऐसा है जो दिमाग में आया था। – MattSull

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