Καλημέρα σας...
εξετάζω το .net 4. Και μια δεν έχω ξαναπιάσει το Linq ever...μου προέκυψε το εξής : "Να φτιάξω μια κλάση που να επικοινωνεί με την βάση και να χρησιμοποιήσω transaction με Linq2sql".
Θα ήθελα να σας το υποβάλλω στην κρίση σας λοιπόν και να μου πείτε άν κάνω κάποιο λάθος μέχρι εδώ...
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
| namespace IBilling.Tests.Controllers {
public class SQL {
public void selectFromSQL() {
IBillingRepository billingRepository = new Models.IBillingRepository();
var db = IBilling.Models.IBillingRepository.getDb();
db.Log = Console.Out;
db.Connection.Open();
System.Data.Common.DbTransaction trx = db.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
db.Transaction = trx;
var companies = billingRepository.getCompanyByID("00F1AF44-C882-455E-ADEC-9777F11F409B");
Assert.AreEqual(companies.CompanyCode, "01002012 ");
companies.CompanyCode = "01002012 ";
try {
db.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
if (trx != null)
trx.Commit();
companies = billingRepository.getCompanyByID("00F1AF44-C882-455E-ADEC-9777F11F409B");
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
if (trx != null)
trx.Rollback();
} finally {
// Close the connection
if (db.Connection.State == System.Data.ConnectionState.Open)
db.Connection.Close();
}
Assert.AreEqual(companies.CompanyCode, "01002012 ");
}
} |
Αν είναι οκ, το πρόβλημα μου τότε είναι ότι ήθελα να το τεστάρω. Παρατήρησα λοιπόν το εξής:
1. Αν είχα 2 μεθόδους διαφορετικές με ίδιο body της συνάρτησης η "companies", είχε τις τιμές σε διαφορετικό "scope"! Αυτό δεν το περίμενα. Έχει να κάνει ότι ειναι δυναμική; (var)? Γίνεται;
2. Αλλαξα στην μια companies και στην άλλη το έκανα companies2. Πάλι μου έβγαζε πρόβλημα το connection. Λογικό;
3. Σκέφτομαι να κάνω παράλληλη επεξεργασία της ίδιας της συνάρτησης και μου έρχετε PLinq :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [TestClass]
public class TestSQL {
[TestMethod]
public void run() {
IEnumerable<SQL> qries = new SQL[] {new SQL(), new SQL() };
Stopwatch watch = new Stopwatch();
watch.Start();
var data = from eachRun in qries.AsParallel() select new {
eachRun, ThreadID = Thread.CurrentThread.ManagedThreadId
};
try {
data.ForAll(i => i.eachRun.selectFromSQL());
} catch (AggregateException ex) {
Console.WriteLine(ex.InnerException.Message);
}
watch.Stop();
Console.WriteLine(watch.Elapsed.ToString());
Console.ReadLine();
}
} |
Και ΑΝ είναι και αυτό σωστά γραμμένο(!), το πρόβλημα είναι ότι δεν μπορώ να καταλάβω ( γιατί δεν έχω βρεί τον τρόπο πώς να ταυτοποιήσω το δεύτερο thread ), σκάει με ένα μήνυμα : "An item with the same key has already been added.".
Και υποθέτω τώρα, ότι το companies (γιατί εκεί γίνεται) έχει κάνει το select στο πρώτο thread, αλλά...το 2ο thread, έχει ίδιο reference στο αρχικό companies. (Ξαναλέω δεν έχω καταφέρει να δώ πώς και αν αυτό ισχύει γιατί πραγματικά είναι 2 τα threads. Απλά όταν πατάω F10 το καταλαβαίνω γιατί σε κάθε γραμμή η φωτεινή κίτρινη γραμμή, εκτελείται 2 φορές. )
Με συγχωρείται για το μεγάλο post...