2012-10-15 8 views
6

मैं उपयोग कर रहा हूँ एफई 5 कोड के पहले और 2 संबंधित संस्थाओं ApplicationPermission और अनुप्रयोग है:मैं इकाई फ्रेमवर्क 5 कोड के साथ नेविगेशन प्रॉपर्टी के साथ ऑब्जेक्ट को कैसे हटा सकता हूं?

HasKey(x => x.Id); 
HasRequired(x => x.Application).WithMany().Map(m => m.MapKey("ApplicationId")).WillCascadeOnDelete(false); 

और आवेदन के लिए:

HasKey(x => x.Id); 
ApplicationPermission निम्नलिखित मानचित्रण के साथ

public class ApplicationPermission 
{ 
    public virtual Application Application { get; set; } 

    public int Id { get; set; } 
} 

public class Application 
{ 
    public string Name { get; set; } 

    public int Id { get; set; } 
} 

मैं आवेदन अनुमति को हटाने के लिए नीचे दिए गए कोड का उपयोग करता हूं:

ApplicationPermission entity = new ApplicationPermission { Id = id }; 
DbContext.Set<ApplicationPermission>().Attach(entity); 
DbContext.Set<ApplicationPermission>().Remove(entity); 
DbContext.SaveChanges(); 

लेकिन मैं SaveChanges पद्धति पर एक त्रुटि मिली: 'CodeFirstContainer.ApplicationPermissions' 'ApplicationPermission_Application' रिश्ते में भाग लेने में

संस्थाओं। 0 संबंधित 'ApplicationPermission_Application_Target' पाए गए। 1 'ApplicationPermission_Aplication_Target' की उम्मीद है।

मैं dbcontext पर एप्लिकेशन लोड किए बिना एप्लिकेशनप्रमिशन को कैसे हटा सकता हूं?

उत्तर

3

मेरा मानना ​​है कि यह जब तुम स्वतंत्र संघों का उपयोग सेट आवश्यक नेविगेशन गुण बिना एक इकाई को हटाने के लिए संभव नहीं है। आप डेटाबेस से Application लोड करना होगा या - कम से कम - विदेशी कुंजी मान को जानते हैं और कि मूल्य के साथ एक Application इकाई देते हैं, तो जैसे:

ApplicationPermission entity = new ApplicationPermission { Id = 1 }; 
entity.Application = new Application { Id = 5 }; 
DbContext.Set<ApplicationPermission>().Attach(entity); //attaches Application too 
DbContext.Set<ApplicationPermission>().Remove(entity); 
DbContext.SaveChanges(); 

एसक्यूएल उत्पन्न होती है जब आप SaveChanges फोन आदेश तो है:

exec sp_executesql N'delete [dbo].[ApplicationPermissions] 
where (([Id] = @0) and ([ApplicationId] = @1))',N'@0 int,@1 int',@0=1,@1=5 

आप देख सकते हैं delete के लिए क्वेरी केवल ApplicationPermission की Id नष्ट करने के लिए, लेकिन यह भी (and) ApplicationId के लिए विदेशी कुंजी मान के लिए पूछ नहीं है। सफल होने के लिए आपको संबंधित प्राथमिक इकाई के साथ संबंधित इकाई को सेट करके इस एफके मान को जानना और सेट करना होगा।

समस्या नहीं होती है जब विदेशी कुंजी संघों का उपयोग कर:

public class ApplicationPermission 
{ 
    public virtual Application Application { get; set; } 
    public int ApplicationId { get; set; } 

    public int Id { get; set; } 
} 

मैपिंग:

modelBuilder.Entity<ApplicationPermission>() 
    .HasRequired(x => x.Application) 
    .WithMany() 
    .HasForeignKey(x => x.ApplicationId) 
    .WillCascadeOnDelete(false); 

फिर आप एक सही मान को FK संपत्ति ApplicationId की स्थापना के बिना अपने मूल कोड का उपयोग कर सकते (तब 0 पर डिफ़ॉल्ट होगा) और नेविगेशन प्रॉपर्टी को सेट किए बिना और इकाई को हटाने के बिना काम करेगा। एसक्यूएल आदेश FK के बारे में परवाह नहीं है और सिर्फ ApplicationPermission की Id को नष्ट करने के लिए प्रश्नों:

exec sp_executesql N'delete [dbo].[ApplicationPermissions] 
where ([Id] = @0)',N'@0 int',@0=1 

मुझे पता नहीं क्यों SQL कमांड के संघों के दो प्रकार के बीच अलग हैं।

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

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