2012-09-04 6 views
5

का उपयोग कर प्रति पंक्ति एक नए मूल्य के साथ पंक्ति डेटा अपडेट करें मैं तालिका में एक नया कॉलम जोड़ने के लिए fluentmigrator का उपयोग कर रहा हूं। मैं फिर उस कॉलम के लिए एक अद्वितीय मान के साथ तालिका में प्रत्येक पंक्ति को अद्यतन करना चाहता हूं।फ़्लेंटमिग्रेटर

वर्तमान में मैं जब का उपयोग करें:

Update.Table("Foo").InSchema("dbo").Set(new { Bar = Bar.Generate() }).AllRows(); 

यह सभी पंक्तियों के लिए एक ही मूल्य देता है।

मैं कैसे सुनिश्चित करूं कि यह प्रत्येक पंक्ति के लिए उस विधि को कॉल करे?

उत्तर

7

मुझे यकीन नहीं है कि Bar.Generate क्या करता है लेकिन मुझे लगता है कि यह एक GUID या अद्वितीय आईडी बनाता है।

यदि ऐसा है तो आप इस्तेमाल कर सकते हैं:

Execute.Sql("update dbo.Foo set Bar = NEWID()"); 

या यदि आप अनुक्रमिक guids चाहते तो आप NEWSEQUENTIALID() इस्तेमाल कर सकते हैं।

आप इस अद्वितीय identier के लिए एक नया स्तंभ जोड़ रहे हैं, तो तुम सब करने की आवश्यकता होगी नया स्तंभ निर्दिष्ट है .AsGuid()

संपादित करें: FluentMigrator एक छोटे से धाराप्रवाह डीएसएल है और कवर करने के लिए नहीं होती है इस तरह एक जटिल मामला। एक एसक्यूएल अद्यतन के साथ ऐसा करने के लिए कोई रास्ता नहीं है (जहां तक ​​मुझे पता है) और इसलिए FluentMigrator के साथ ऐसा करने का कोई आसान तरीका नहीं है। आपको ADO.NET या ORM (Dapper/NHibernate) के साथ तालिका के लिए पंक्ति गणना प्राप्त करनी होगी और फिर प्रत्येक पंक्ति के माध्यम से लूप प्राप्त करना होगा और कस्टम अद्वितीय पहचानकर्ता के साथ बार कॉलम अपडेट करना होगा। तो यदि आपके पास दस लाख पंक्तियां हैं तो आपको दस लाख वर्ग अपडेट करना होगा। यदि आप अपने बार। जेनरेट() विधि को एक एसक्यूएल फ़ंक्शन के रूप में दोबारा लिख ​​सकते हैं जो this या this जैसे NEWID() फ़ंक्शन पर आधारित है तो आप इसे एक अपडेट स्टेटमेंट के रूप में कर सकते हैं और इसे FluentMigrator's Execute.Sql विधि से कॉल कर सकते हैं।

आपने उल्लेख नहीं किया है कि आप किस डेटाबेस के साथ काम कर रहे हैं। लेकिन पोस्टग्रेस की तरह कुछ non-standard features हैं जो आपकी मदद कर सकते हैं।

+0

यह मेरा स्वयं का कार्य है जो एक अद्वितीय "दोस्ताना" स्ट्रिंग बनाता है, क्षमा करें, कोई मार्गदर्शक नहीं है। – shenku

+2

क्या आप अपने फ़ंक्शन को SQL फ़ंक्शन के रूप में पुनः लिख सकते हैं? अन्यथा आपको अपनी तालिका में सभी पंक्तियों के माध्यम से लूप करना होगा। –

+1

यह ध्यान दिया जाना चाहिए कि आपके कोड उदाहरण में, कीवर्ड 'तालिका' वहां नहीं होना चाहिए, आदेश नहीं चलाया जाएगा। अपने वास्तविक तालिका नाम के साथ बदलें। – shanabus