चेतावनी: निम्नलिखित केवल छोटी तालिकाओं के लिए उपयुक्त है (सोचें <1000 पंक्तियाँ)
यहां एक समाधान है जो पंक्तियों को हटाने के लिए इकाई ढांचे (एसक्यूएल नहीं) का उपयोग करता है, इसलिए यह एसक्यूएल इंजन (आर / डीबीएम) विशिष्ट नहीं है।
यह मानता है कि आप परीक्षण या कुछ इसी तरह की स्थिति के लिए ऐसा कर रहे हैं। भी
- डेटा की मात्रा छोटी है या
- प्रदर्शन मायने नहीं रखता
बस कॉल करें:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
इस संदर्भ को मानते हुए:
public class VotingContext : DbContext
{
public DbSet<Vote> Votes{get;set;}
public DbSet<Poll> Polls{get;set;}
public DbSet<Voter> Voters{get;set;}
public DbSet<Candidacy> Candidates{get;set;}
}
Tidier कोड के लिए आप निम्नलिखित एक्सटेंशन विधि की घोषणा कर सकते हैं:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
फिर ऊपर बन जाता है:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
मैंने हाल ही में प्रत्येक टेस्टकेस रन के लिए अपने परीक्षण डेटाबेस को साफ करने के लिए इस दृष्टिकोण का उपयोग किया (यह स्पष्ट रूप से हर बार डीबी को फिर से बनाने की तुलना में तेजी से होता है, हालांकि मैं हटाए गए आदेशों के रूप की जांच नहीं करता था)।
यह धीमा क्यों हो सकता है?
- EF को सभी पंक्तियाँ मिलेंगी (VotingContext.Votes)
- और फिर उन्हें हटाने के लिए उनकी आईडी (निश्चित रूप से कैसे, कोई फर्क नहीं पड़ता) का उपयोग करेगा।
यदि आप डेटा की गंभीर मात्रा के साथ काम कर रहे हैं, तो आप SQL सर्वर प्रक्रिया को मार देंगे (यह सभी मेमोरी का उपभोग करेगा) और IIS प्रक्रिया के लिए एक ही बात है क्योंकि EF सभी डेटा को उसी तरह से कैश करेगा जैसे SQL सर्वर। यदि आपकी तालिका में गंभीर मात्रा में डेटा है तो इसका उपयोग न करें।
TRUNCATE
विदेशी प्रमुख बाधाओं की चिंता क्यों नहीं करता ।