मैं किसी ऑब्जेक्ट को पहले डीबी से प्राप्त किए बिना कैसे हटा सकता हूं? बाहर IQuery वस्तु पर ExecuteUpdate विधिnhibernate में पीके का उपयोग कर किसी ऑब्जेक्ट को कैसे हटाएं?
session.Delete<User>(1); // 1 = PK
मैं किसी ऑब्जेक्ट को पहले डीबी से प्राप्त किए बिना कैसे हटा सकता हूं? बाहर IQuery वस्तु पर ExecuteUpdate विधिnhibernate में पीके का उपयोग कर किसी ऑब्जेक्ट को कैसे हटाएं?
session.Delete<User>(1); // 1 = PK
अपनी परियोजना के लिए निम्न वर्ग जोड़ें:
public static class SessionHelper
{
public static void Delete<TEntity>(this ISession session, object id)
{
var queryString = string.Format("delete {0} where id = :id",
typeof(TEntity));
session.CreateQuery(queryString)
.SetParameter("id", id)
.ExecuteUpdate();
}
}
अब आप session.Delete<User>(1)
उपयोग कर सकते हैं।
की जांच:
एक और ORM में, मैं यह कर सकता हूँ।
IQuery q = session.CreateQuery ("delete from User where Id = 1");
q.ExecuteUpdate();
इसे पुनर्प्राप्त किए बिना ऑब्जेक्ट को हटाना चाहिए।
आप ऐसा करते हैं
User user = new User();
user.Id = 1;
session.Delete(user);
इस कोशिश कर सकते:
var user = session.Load<User>(1);
session.Delete(user);
Load
पहचानकर्ता सेट के साथ उपयोगकर्ता वस्तु के लिए एक प्रॉक्सी पैदा करेगा। मुझे यकीन नहीं है कि Delete
ऑब्जेक्ट को इसे हटाने से पहले डेटाबेस से लोड करेगा और मैं इस समय इसका परीक्षण करने में असमर्थ हूं।
मुझे डर है कि यह इसे लोड करता हूँ को परिभाषित करता है स्वीकार करता है। –
लोड नहीं मिला है! लोड वास्तविक वस्तु के लिए सिर्फ प्रॉक्सी बनाता है। यह सिर्फ एक आईडी के साथ एक बॉक्स है। वास्तव में डेटाबेस से रिकॉर्ड लोड हो जाओ। तो, नहीं, जब तक आप केवल आईडी संपत्ति को पढ़ते हैं, तब तक यह "वास्तव में" डीबी से कुछ भी लोड नहीं करता है। –
जैसा कि आपने कहा था "लोड" उपयोगकर्ता को लोड नहीं करेगा। लेकिन हटाएं हमेशा, होगा। – Junior
ver 2 से पहले कोई रास्ता नहीं था। ver 2 के बाद आप IQuery
पर ExecuteUpdate()
विधि है और वहाँ ISession.Delete()
पर एक ओवरलोड विधि जहां यह एक स्ट्रिंग है कि एक विलोपन क्वेरी
शायद 2010 में सच है लेकिन आजकल –
@LuisFilipe के साथ और अधिक बेहतर विकल्प हैं: और वे हैं ...? ? –
क्या यह भी काम करेगा यदि मेरे प्राथमिक कुंजी कॉलम का नाम "आईडी" से अलग है? –
@A_J हां। 'आईडी' एक विशेष नाम है जो एंटीटी की आईडी का प्रतिनिधित्व करता है। Http://nhibernate.info/doc/nhibernate-reference/queryhql.html#queryhql-where देखें। –
क्यों न सिर्फ 'सत्र। हटाएं (session.Query()। फर्स्टऑर्डडिफॉल्ट (सी => सी.आईडी == आईडी)); '? –