<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: LinQ to SQL with Transactions ( Cookie: PLinq )</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59326.aspx</link><pubDate>Thu, 01 Jul 2010 04:25:44 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59326</guid><dc:creator>m6s</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59326.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=59326</wfw:commentRss><description>Οπα ξαναβλέπωντας το , καλώ το getDb() αυτό ήταν static ( γιατί δεν ήθελα να ανοίγω νέα context! ), Οπότε αυτό ίσως προκαλεί το πρόβλημα για το αρχικό μήνυμα.&lt;br&gt;Θα το δοκιμάσω αυριο γραφείο....&lt;br&gt;</description></item><item><title>Απ: LinQ to SQL with Transactions ( Cookie: PLinq )</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59325.aspx</link><pubDate>Thu, 01 Jul 2010 04:23:58 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59325</guid><dc:creator>m6s</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59325.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=59325</wfw:commentRss><description>Μάρκο Καλησπέρα,&lt;br&gt;&lt;br&gt;Οσον αφορά το transactionscope το είδα είναι ένας εναλλακτικός τρόπος. Αλλά από οτι βλέπω έχω πετύχει το transaction. (Λόγω των τεστ που έκανα, δοκίμασα σε κάποια φάση εξωτερικά να εισάγω μια γραμμή ενώ είχα δώσει το select και ήμουν στο transaction ). Επίσης, όπως έχω δεί στα tutorial δεν πρέπει να χω ξεφύγει.&lt;br&gt;&lt;br&gt;Αυτό που λές που όμως για το context/connection με ανησυχεί. Έχω καταλάβει σωστά, ή όχι, ότι το datacontext δεν είναι dataset. Και ανοίγει κάθε φορά που ζητάς με ένα tab σε browser την σελίδα. Δεν έχει να κάνει με το session επίσης. (Εκτός και αν το βάλεις σε κάποια Session Array. Σωστά;&lt;br&gt;Αρά αν έχω στο ταβ1 την σελίδα, στο ταβ2 είναι διαφορετικό το datacontext. Λάθος;&lt;br&gt;&lt;br&gt;Ξεκινώντας το στο σημείο του PLinq, περιμένω να έχω διαφορετικά context. Διότι καλώ την selectSQL(), ( ΝΟΜΙΖΩ) κάθε φορά από την αρχή με νέο context. ε?&lt;br&gt;&lt;br&gt;( Flame Probability :-) &lt;br&gt;Το PLinq, μου φάνηκε τίποτα περισσότερο απο το Linq ( ήδη είναι η 
δευτερη μέρα που το ασχολιέμαι με το Linq και μου φαίνεται λίγο δύστροπο
 ).&lt;br&gt;
Το Plinq όμως νομίζω κάνει αυτό που θέλω εύκολα αρκεί να ξέρεις το 
συντακτικό. &lt;br&gt;Επειδή ήδη μου εχει φανεί σίχαμα ο συνδυασμός Linq2sql με infragistics, είπα να χρησιμοποιείσω το PLinq :-P :-P :-P)&lt;br&gt;&lt;br&gt;&lt;br&gt;Master-Detail με Linq παλεύεται;&lt;br&gt;</description></item><item><title>Απ: LinQ to SQL with Transactions ( Cookie: PLinq )</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59319.aspx</link><pubDate>Wed, 30 Jun 2010 21:55:32 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59319</guid><dc:creator>Markos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59319.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=59319</wfw:commentRss><description>&lt;P&gt;Τα explicit&amp;nbsp;transactions στο Linq2Sql και στο EF χρησιμοποιούνται σε συγκεκριμένες περιπτώσεις μιας και οι μεταβολές στο context όταν αποστέλλονται στη βάση αποθηκεύονται στο πλαίσιο ενός transaction έτσι κι αλλιώς. Στη συγκεκριμένη περίπτωση, η συμπεριφορά που παρατηρείς δεν οφείλεται στο var, αλλά μάλλον στο ότι ανοίγεις και δεύτερο context ή/και connection. Αν θέλεις να δουλέψεις μ' αυτόν τον τρόπο χρησιμοποίησε το &lt;A href="http://www.west-wind.com/weblog/posts/826145.aspx"&gt;transactionscope&lt;/A&gt;, που είναι και ο απλούστερος τρόπος για να πετύχεις αυτό που θέλεις όταν έχεις κι άλλο context ανοιχτό.&lt;/P&gt;
&lt;P&gt;Δεν έχω ασχοληθεί με PLINQ, αλλά στο δεύτερο κομμάτι κώδικα προσπαθείς να τρέξεις το ίδιο query δύο φορές και να βάλεις τα αποτελέσματα στο ίδιο context; Πιθανόν γι΄αυτό σου λέει ότι υπάρχουν αντικείμενα με το ίδιο key. Επίσης, δεν είναι υπερβολικό που μπλέκεις PLinq με threading;&lt;/P&gt;</description></item><item><title>LinQ to SQL with Transactions ( Cookie: PLinq )</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59316.aspx</link><pubDate>Wed, 30 Jun 2010 19:03:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59316</guid><dc:creator>m6s</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59316.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=59316</wfw:commentRss><description>Καλημέρα σας...&lt;br&gt;εξετάζω το .net 4. Και μια δεν έχω ξαναπιάσει το Linq ever...μου προέκυψε το εξής : "Να φτιάξω μια κλάση που να επικοινωνεί με την βάση και να χρησιμοποιήσω transaction με Linq2sql".&lt;br&gt;Θα ήθελα να σας το υποβάλλω στην κρίση σας λοιπόν και να μου πείτε άν κάνω κάποιο λάθος μέχρι εδώ...&lt;br&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tr style="vertical-align:top;line-height:normal;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="font-family:courier new;font-size:11px;color:gray;margin:0px;padding:2px;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px 2px 2px 8px;"&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;namespace&lt;/span&gt; IBilling.Tests.Controllers {
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; SQL {
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; selectFromSQL() {
			IBillingRepository billingRepository &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Models.IBillingRepository();
			var db &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; IBilling.Models.IBillingRepository.getDb();
			db.Log &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Console.Out;
			db.Connection.Open();
			System.Data.Common.DbTransaction trx &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; db.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
			db.Transaction &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; trx;
			var companies &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; billingRepository.getCompanyByID(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"00F1AF44-C882-455E-ADEC-9777F11F409B"&lt;/span&gt;);
			Assert.AreEqual(companies.CompanyCode, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"01002012  "&lt;/span&gt;);
			companies.CompanyCode &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"01002012  "&lt;/span&gt;;
			&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;try&lt;/span&gt; {
				db.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
				&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (trx !&lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;null&lt;/span&gt;)
					trx.Commit();
				companies &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; billingRepository.getCompanyByID(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"00F1AF44-C882-455E-ADEC-9777F11F409B"&lt;/span&gt;);
			} &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;catch&lt;/span&gt; (Exception ex) {
				Console.WriteLine(ex.ToString());
				&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (trx !&lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;null&lt;/span&gt;)
					trx.Rollback();
			} &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;finally&lt;/span&gt; {

				&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Close the connection&lt;/span&gt;
				&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (db.Connection.State == System.Data.ConnectionState.Open)
					db.Connection.Close();
			}
			Assert.AreEqual(companies.CompanyCode, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"01002012  "&lt;/span&gt;);
		}
	}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;Αν είναι οκ, το πρόβλημα μου τότε είναι ότι ήθελα να το τεστάρω. Παρατήρησα λοιπόν το εξής:&lt;br&gt;1. Αν είχα 2 μεθόδους διαφορετικές με ίδιο body της συνάρτησης η "companies", είχε τις τιμές σε διαφορετικό "scope"! Αυτό δεν το περίμενα. Έχει να κάνει ότι ειναι δυναμική; (var)? Γίνεται;&lt;br&gt;2. Αλλαξα στην μια companies και στην άλλη το έκανα companies2. Πάλι μου έβγαζε πρόβλημα το connection. Λογικό;&lt;br&gt;3. Σκέφτομαι να κάνω παράλληλη επεξεργασία της ίδιας της συνάρτησης και μου έρχετε PLinq :&lt;br&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tr style="vertical-align:top;line-height:normal;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="font-family:courier new;font-size:11px;color:gray;margin:0px;padding:2px;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px 2px 2px 8px;"&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;[TestClass]
	&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;class&lt;/span&gt; TestSQL {
		[TestMethod]
		&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; run() {
			IEnumerable&amp;lt;SQL&amp;gt; qries &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; SQL[] {&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; SQL(), &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; SQL() };
			Stopwatch watch &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; Stopwatch();
			watch.Start();
			var data &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; from eachRun &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; qries.AsParallel() select &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; {
				eachRun, ThreadID &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Thread.CurrentThread.ManagedThreadId
			};
			&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;try&lt;/span&gt; {
				data.ForAll(i =&amp;gt; i.eachRun.selectFromSQL());
			} &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;catch&lt;/span&gt; (AggregateException ex) {
				Console.WriteLine(ex.InnerException.Message);
			}
			watch.Stop();
			Console.WriteLine(watch.Elapsed.ToString());
			Console.ReadLine();

		}
	}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;Και ΑΝ είναι και αυτό σωστά γραμμένο(!), το πρόβλημα είναι ότι δεν μπορώ να καταλάβω ( γιατί δεν έχω βρεί τον τρόπο πώς να ταυτοποιήσω το δεύτερο thread ), σκάει με ένα μήνυμα : "An item with the same key has already been added.".&lt;br&gt;Και υποθέτω τώρα, ότι το companies (γιατί εκεί γίνεται) έχει κάνει το select στο πρώτο thread, αλλά...το 2ο thread, έχει ίδιο reference στο αρχικό companies. (Ξαναλέω δεν έχω&amp;nbsp; καταφέρει να δώ πώς και αν αυτό ισχύει γιατί πραγματικά είναι 2 τα threads. Απλά όταν πατάω F10 το καταλαβαίνω γιατί σε κάθε γραμμή η φωτεινή κίτρινη γραμμή, εκτελείται 2 φορές. )&lt;br&gt;&lt;br&gt;Με συγχωρείται για το μεγάλο post...&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item></channel></rss>