Mercurial > pub > bltoolkit
comparison UnitTests/Linq/UpdateTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Linq; | |
| 4 | |
| 5 using BLToolkit.Data; | |
| 6 using BLToolkit.Data.DataProvider; | |
| 7 using BLToolkit.Data.Linq; | |
| 8 using BLToolkit.DataAccess; | |
| 9 using BLToolkit.Mapping; | |
| 10 | |
| 11 using NUnit.Framework; | |
| 12 | |
| 13 using Data.Linq; | |
| 14 using Data.Linq.Model; | |
| 15 | |
| 16 #region ReSharper disable | |
| 17 // ReSharper disable ConvertToConstant.Local | |
| 18 #endregion | |
| 19 | |
| 20 namespace Update | |
| 21 { | |
| 22 [TestFixture] | |
| 23 public class UpdateTest : TestBase | |
| 24 { | |
| 25 [Test] | |
| 26 public void Update1() | |
| 27 { | |
| 28 ForEachProvider(db => | |
| 29 { | |
| 30 try | |
| 31 { | |
| 32 var parent = new Parent1 { ParentID = 1001, Value1 = 1001 }; | |
| 33 | |
| 34 db.Parent.Delete(p => p.ParentID > 1000); | |
| 35 db.Insert(parent); | |
| 36 | |
| 37 Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID)); | |
| 38 Assert.AreEqual(1, db.Parent.Update(p => p.ParentID == parent.ParentID, p => new Parent { ParentID = p.ParentID + 1 })); | |
| 39 Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID + 1)); | |
| 40 } | |
| 41 finally | |
| 42 { | |
| 43 db.Child.Delete(c => c.ChildID > 1000); | |
| 44 } | |
| 45 }); | |
| 46 } | |
| 47 | |
| 48 [Test] | |
| 49 public void Update2() | |
| 50 { | |
| 51 ForEachProvider(db => | |
| 52 { | |
| 53 try | |
| 54 { | |
| 55 var parent = new Parent1 { ParentID = 1001, Value1 = 1001 }; | |
| 56 | |
| 57 db.Parent.Delete(p => p.ParentID > 1000); | |
| 58 db.Insert(parent); | |
| 59 | |
| 60 Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID)); | |
| 61 Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == parent.ParentID).Update(p => new Parent { ParentID = p.ParentID + 1 })); | |
| 62 Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID + 1)); | |
| 63 } | |
| 64 finally | |
| 65 { | |
| 66 db.Child.Delete(c => c.ChildID > 1000); | |
| 67 } | |
| 68 }); | |
| 69 } | |
| 70 | |
| 71 [Test] | |
| 72 public void Update3() | |
| 73 { | |
| 74 ForEachProvider(new[] { ProviderName.Informix }, db => | |
| 75 { | |
| 76 try | |
| 77 { | |
| 78 var id = 1001; | |
| 79 | |
| 80 db.Child.Delete(c => c.ChildID > 1000); | |
| 81 db.Child.Insert(() => new Child { ParentID = 1, ChildID = id}); | |
| 82 | |
| 83 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); | |
| 84 Assert.AreEqual(1, db.Child.Where(c => c.ChildID == id && c.Parent.Value1 == 1).Update(c => new Child { ChildID = c.ChildID + 1 })); | |
| 85 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1)); | |
| 86 } | |
| 87 finally | |
| 88 { | |
| 89 db.Child.Delete(c => c.ChildID > 1000); | |
| 90 } | |
| 91 }); | |
| 92 } | |
| 93 | |
| 94 [Test] | |
| 95 public void Update4() | |
| 96 { | |
| 97 ForEachProvider(new[] { ProviderName.Informix }, db => | |
| 98 { | |
| 99 try | |
| 100 { | |
| 101 var id = 1001; | |
| 102 | |
| 103 db.Child.Delete(c => c.ChildID > 1000); | |
| 104 db.Child.Insert(() => new Child { ParentID = 1, ChildID = id}); | |
| 105 | |
| 106 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); | |
| 107 Assert.AreEqual(1, | |
| 108 db.Child | |
| 109 .Where(c => c.ChildID == id && c.Parent.Value1 == 1) | |
| 110 .Set(c => c.ChildID, c => c.ChildID + 1) | |
| 111 .Update()); | |
| 112 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1)); | |
| 113 } | |
| 114 finally | |
| 115 { | |
| 116 db.Child.Delete(c => c.ChildID > 1000); | |
| 117 } | |
| 118 }); | |
| 119 } | |
| 120 | |
| 121 [Test] | |
| 122 public void Update5() | |
| 123 { | |
| 124 ForEachProvider(new[] { ProviderName.Informix }, db => | |
| 125 { | |
| 126 try | |
| 127 { | |
| 128 var id = 1001; | |
| 129 | |
| 130 db.Child.Delete(c => c.ChildID > 1000); | |
| 131 db.Child.Insert(() => new Child { ParentID = 1, ChildID = id}); | |
| 132 | |
| 133 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); | |
| 134 Assert.AreEqual(1, | |
| 135 db.Child | |
| 136 .Where(c => c.ChildID == id && c.Parent.Value1 == 1) | |
| 137 .Set(c => c.ChildID, () => id + 1) | |
| 138 .Update()); | |
| 139 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1)); | |
| 140 } | |
| 141 finally | |
| 142 { | |
| 143 db.Child.Delete(c => c.ChildID > 1000); | |
| 144 } | |
| 145 }); | |
| 146 } | |
| 147 | |
| 148 [Test] | |
| 149 public void Update6() | |
| 150 { | |
| 151 ForEachProvider(new[] { ProviderName.Informix }, db => | |
| 152 { | |
| 153 try | |
| 154 { | |
| 155 var id = 1001; | |
| 156 | |
| 157 db.Parent4.Delete(p => p.ParentID > 1000); | |
| 158 db.Insert(new Parent4 { ParentID = id, Value1 = TypeValue.Value1 }); | |
| 159 | |
| 160 Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value1)); | |
| 161 Assert.AreEqual(1, | |
| 162 db.Parent4 | |
| 163 .Where(p => p.ParentID == id) | |
| 164 .Set(p => p.Value1, () => TypeValue.Value2) | |
| 165 .Update()); | |
| 166 Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value2)); | |
| 167 } | |
| 168 finally | |
| 169 { | |
| 170 db.Parent4.Delete(p => p.ParentID > 1000); | |
| 171 } | |
| 172 }); | |
| 173 } | |
| 174 | |
| 175 [Test] | |
| 176 public void Update7() | |
| 177 { | |
| 178 ForEachProvider(new[] { ProviderName.Informix }, db => | |
| 179 { | |
| 180 try | |
| 181 { | |
| 182 var id = 1001; | |
| 183 | |
| 184 db.Parent4.Delete(p => p.ParentID > 1000); | |
| 185 db.Insert(new Parent4 { ParentID = id, Value1 = TypeValue.Value1 }); | |
| 186 | |
| 187 Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value1)); | |
| 188 Assert.AreEqual(1, | |
| 189 db.Parent4 | |
| 190 .Where(p => p.ParentID == id) | |
| 191 .Set(p => p.Value1, TypeValue.Value2) | |
| 192 .Update()); | |
| 193 Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value2)); | |
| 194 | |
| 195 Assert.AreEqual(1, | |
| 196 db.Parent4 | |
| 197 .Where(p => p.ParentID == id) | |
| 198 .Set(p => p.Value1, TypeValue.Value3) | |
| 199 .Update()); | |
| 200 Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value3)); | |
| 201 } | |
| 202 finally | |
| 203 { | |
| 204 db.Parent4.Delete(p => p.ParentID > 1000); | |
| 205 } | |
| 206 }); | |
| 207 } | |
| 208 | |
| 209 [Test] | |
| 210 public void Update8() | |
| 211 { | |
| 212 ForEachProvider(db => | |
| 213 { | |
| 214 try | |
| 215 { | |
| 216 var parent = new Parent1 { ParentID = 1001, Value1 = 1001 }; | |
| 217 | |
| 218 db.Parent.Delete(p => p.ParentID > 1000); | |
| 219 db.Insert(parent); | |
| 220 | |
| 221 parent.Value1++; | |
| 222 | |
| 223 db.Update(parent); | |
| 224 | |
| 225 Assert.AreEqual(1002, db.Parent.Single(p => p.ParentID == parent.ParentID).Value1); | |
| 226 } | |
| 227 finally | |
| 228 { | |
| 229 db.Child.Delete(c => c.ChildID > 1000); | |
| 230 } | |
| 231 }); | |
| 232 } | |
| 233 | |
| 234 [Test] | |
| 235 public void Update9() | |
| 236 { | |
| 237 ForEachProvider(new[] { ProviderName.Informix, ProviderName.SqlCe, ProviderName.DB2, ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, db => | |
| 238 { | |
| 239 try | |
| 240 { | |
| 241 var id = 1001; | |
| 242 | |
| 243 db.Child.Delete(c => c.ChildID > 1000); | |
| 244 db.Child.Insert(() => new Child { ParentID = 1, ChildID = id}); | |
| 245 | |
| 246 var q = | |
| 247 from c in db.Child | |
| 248 join p in db.Parent on c.ParentID equals p.ParentID | |
| 249 where c.ChildID == id && c.Parent.Value1 == 1 | |
| 250 select new { c, p }; | |
| 251 | |
| 252 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); | |
| 253 Assert.AreEqual(1, q.Update(db.Child, _ => new Child { ChildID = _.c.ChildID + 1, ParentID = _.p.ParentID })); | |
| 254 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1)); | |
| 255 } | |
| 256 finally | |
| 257 { | |
| 258 db.Child.Delete(c => c.ChildID > 1000); | |
| 259 } | |
| 260 }); | |
| 261 } | |
| 262 | |
| 263 [Test] | |
| 264 public void Update10() | |
| 265 { | |
| 266 ForEachProvider(new[] { ProviderName.Informix, ProviderName.SqlCe, ProviderName.DB2, ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, db => | |
| 267 { | |
| 268 try | |
| 269 { | |
| 270 var id = 1001; | |
| 271 | |
| 272 db.Child.Delete(c => c.ChildID > 1000); | |
| 273 db.Child.Insert(() => new Child { ParentID = 1, ChildID = id}); | |
| 274 | |
| 275 var q = | |
| 276 from p in db.Parent | |
| 277 join c in db.Child on p.ParentID equals c.ParentID | |
| 278 where c.ChildID == id && c.Parent.Value1 == 1 | |
| 279 select new { c, p }; | |
| 280 | |
| 281 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); | |
| 282 Assert.AreEqual(1, q.Update(db.Child, _ => new Child { ChildID = _.c.ChildID + 1, ParentID = _.p.ParentID })); | |
| 283 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1)); | |
| 284 } | |
| 285 finally | |
| 286 { | |
| 287 db.Child.Delete(c => c.ChildID > 1000); | |
| 288 } | |
| 289 }); | |
| 290 } | |
| 291 | |
| 292 //[Test] | |
| 293 public void Update11() | |
| 294 { | |
| 295 ForEachProvider(db => | |
| 296 { | |
| 297 var q = db.GetTable<LinqDataTypes2>().Union(db.GetTable<LinqDataTypes2>()); | |
| 298 | |
| 299 //db.GetTable<LinqDataTypes2>().Update(_ => q.Contains(_), _ => new LinqDataTypes2 { GuidValue = _.GuidValue }); | |
| 300 | |
| 301 q.Update(_ => new LinqDataTypes2 { GuidValue = _.GuidValue }); | |
| 302 }); | |
| 303 } | |
| 304 | |
| 305 [Test] | |
| 306 public void UpdateAssociation1([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context) | |
| 307 { | |
| 308 using (var db = GetDataContext(context)) | |
| 309 { | |
| 310 const int childId = 10000; | |
| 311 const int parentId = 20000; | |
| 312 | |
| 313 try | |
| 314 { | |
| 315 db.Child. Delete(x => x.ChildID == childId); | |
| 316 db.Parent.Delete(x => x.ParentID == parentId); | |
| 317 | |
| 318 db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId }); | |
| 319 db.Child. Insert(() => new Child { ChildID = childId, ParentID = parentId }); | |
| 320 | |
| 321 var parents = | |
| 322 from child in db.Child | |
| 323 where child.ChildID == childId | |
| 324 select child.Parent; | |
| 325 | |
| 326 Assert.AreEqual(1, parents.Update(db.Parent, x => new Parent { Value1 = 5 })); | |
| 327 } | |
| 328 finally | |
| 329 { | |
| 330 db.Child. Delete(x => x.ChildID == childId); | |
| 331 db.Parent.Delete(x => x.ParentID == parentId); | |
| 332 } | |
| 333 } | |
| 334 } | |
| 335 | |
| 336 [Test] | |
| 337 public void UpdateAssociation2([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context) | |
| 338 { | |
| 339 using (var db = GetDataContext(context)) | |
| 340 { | |
| 341 const int childId = 10000; | |
| 342 const int parentId = 20000; | |
| 343 | |
| 344 try | |
| 345 { | |
| 346 db.Child. Delete(x => x.ChildID == childId); | |
| 347 db.Parent.Delete(x => x.ParentID == parentId); | |
| 348 | |
| 349 db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId }); | |
| 350 db.Child. Insert(() => new Child { ChildID = childId, ParentID = parentId }); | |
| 351 | |
| 352 var parents = | |
| 353 from child in db.Child | |
| 354 where child.ChildID == childId | |
| 355 select child.Parent; | |
| 356 | |
| 357 Assert.AreEqual(1, parents.Update(x => new Parent { Value1 = 5 })); | |
| 358 } | |
| 359 finally | |
| 360 { | |
| 361 db.Child. Delete(x => x.ChildID == childId); | |
| 362 db.Parent.Delete(x => x.ParentID == parentId); | |
| 363 } | |
| 364 } | |
| 365 } | |
| 366 | |
| 367 [Test] | |
| 368 public void UpdateAssociation3([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context) | |
| 369 { | |
| 370 using (var db = GetDataContext(context)) | |
| 371 { | |
| 372 const int childId = 10000; | |
| 373 const int parentId = 20000; | |
| 374 | |
| 375 try | |
| 376 { | |
| 377 db.Child. Delete(x => x.ChildID == childId); | |
| 378 db.Parent.Delete(x => x.ParentID == parentId); | |
| 379 | |
| 380 db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId }); | |
| 381 db.Child. Insert(() => new Child { ChildID = childId, ParentID = parentId }); | |
| 382 | |
| 383 var parents = | |
| 384 from child in db.Child | |
| 385 where child.ChildID == childId | |
| 386 select child.Parent; | |
| 387 | |
| 388 Assert.AreEqual(1, parents.Update(x => x.ParentID > 0, x => new Parent { Value1 = 5 })); | |
| 389 } | |
| 390 finally | |
| 391 { | |
| 392 db.Child. Delete(x => x.ChildID == childId); | |
| 393 db.Parent.Delete(x => x.ParentID == parentId); | |
| 394 } | |
| 395 } | |
| 396 } | |
| 397 | |
| 398 [Test] | |
| 399 public void UpdateAssociation4([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context) | |
| 400 { | |
| 401 using (var db = GetDataContext(context)) | |
| 402 { | |
| 403 const int childId = 10000; | |
| 404 const int parentId = 20000; | |
| 405 | |
| 406 try | |
| 407 { | |
| 408 db.Child. Delete(x => x.ChildID == childId); | |
| 409 db.Parent.Delete(x => x.ParentID == parentId); | |
| 410 | |
| 411 db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId }); | |
| 412 db.Child. Insert(() => new Child { ChildID = childId, ParentID = parentId }); | |
| 413 | |
| 414 var parents = | |
| 415 from child in db.Child | |
| 416 where child.ChildID == childId | |
| 417 select child.Parent; | |
| 418 | |
| 419 Assert.AreEqual(1, parents.Set(x => x.Value1, 5).Update()); | |
| 420 } | |
| 421 finally | |
| 422 { | |
| 423 db.Child. Delete(x => x.ChildID == childId); | |
| 424 db.Parent.Delete(x => x.ParentID == parentId); | |
| 425 } | |
| 426 } | |
| 427 } | |
| 428 | |
| 429 static readonly Func<TestDbManager,int,string,int> _updateQuery = | |
| 430 CompiledQuery.Compile <TestDbManager,int,string,int>((ctx,key,value) => | |
| 431 ctx.Person | |
| 432 .Where(_ => _.ID == key) | |
| 433 .Set(_ => _.FirstName, value) | |
| 434 .Update()); | |
| 435 | |
| 436 [Test] | |
| 437 public void CompiledUpdate() | |
| 438 { | |
| 439 using (var ctx = new TestDbManager()) | |
| 440 { | |
| 441 _updateQuery(ctx, 12345, "54321"); | |
| 442 } | |
| 443 } | |
| 444 | |
| 445 [TableName("LinqDataTypes")] | |
| 446 class Table1 | |
| 447 { | |
| 448 public int ID; | |
| 449 public bool BoolValue; | |
| 450 | |
| 451 [Association(ThisKey = "ID", OtherKey = "ParentID", CanBeNull = false)] | |
| 452 public List<Table2> Tables2; | |
| 453 } | |
| 454 | |
| 455 [TableName("Parent")] | |
| 456 class Table2 | |
| 457 { | |
| 458 public int ParentID; | |
| 459 public bool Value1; | |
| 460 | |
| 461 [Association(ThisKey = "ParentID", OtherKey = "ID", CanBeNull = false)] | |
| 462 public Table1 Table1; | |
| 463 } | |
| 464 | |
| 465 [Test] | |
| 466 public void UpdateAssociation5([DataContexts( | |
| 467 ProviderName.Access, ProviderName.DB2, ProviderName.Firebird, ProviderName.Informix, "Oracle", ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, | |
| 468 ExcludeLinqService=true)] string context) | |
| 469 { | |
| 470 using (var db = new DbManager(context)) | |
| 471 { | |
| 472 var ids = new[] { 10000, 20000 }; | |
| 473 | |
| 474 db.GetTable<Table2>() | |
| 475 .Where (x => ids.Contains(x.ParentID)) | |
| 476 .Select(x => x.Table1) | |
| 477 .Distinct() | |
| 478 .Set(y => y.BoolValue, y => y.Tables2.All(x => x.Value1)) | |
| 479 .Update(); | |
| 480 | |
| 481 var idx = db.LastQuery.IndexOf("INNER JOIN"); | |
| 482 | |
| 483 Assert.That(idx, Is.Not.EqualTo(-1)); | |
| 484 | |
| 485 idx = db.LastQuery.IndexOf("INNER JOIN", idx + 1); | |
| 486 | |
| 487 Assert.That(idx, Is.EqualTo(-1)); | |
| 488 } | |
| 489 } | |
| 490 | |
| 491 [Test] | |
| 492 public void AsUpdatableTest([DataContexts(ProviderName.Informix)] string context) | |
| 493 { | |
| 494 using (var db = GetDataContext(context)) | |
| 495 { | |
| 496 try | |
| 497 { | |
| 498 var id = 1001; | |
| 499 | |
| 500 db.Child.Delete(c => c.ChildID > 1000); | |
| 501 db.Child.Insert(() => new Child { ParentID = 1, ChildID = id}); | |
| 502 | |
| 503 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id)); | |
| 504 | |
| 505 var q = db.Child.Where(c => c.ChildID == id && c.Parent.Value1 == 1); | |
| 506 var uq = q.AsUpdatable(); | |
| 507 | |
| 508 uq = uq.Set(c => c.ChildID, c => c.ChildID + 1); | |
| 509 | |
| 510 Assert.AreEqual(1, uq.Update()); | |
| 511 Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1)); | |
| 512 } | |
| 513 finally | |
| 514 { | |
| 515 db.Child.Delete(c => c.ChildID > 1000); | |
| 516 } | |
| 517 } | |
| 518 } | |
| 519 | |
| 520 [TableName("GrandChild")] | |
| 521 class Table3 | |
| 522 { | |
| 523 [PrimaryKey(1)] public int? ParentID; | |
| 524 [PrimaryKey(2)] public int? ChildID; | |
| 525 public int? GrandChildID; | |
| 526 } | |
| 527 | |
| 528 [Test] | |
| 529 public void UpdateNullablePrimaryKey([DataContexts] string context) | |
| 530 { | |
| 531 using (var db = GetDataContext(context)) | |
| 532 { | |
| 533 db.Update(new Table3 { ParentID = 10000, ChildID = null, GrandChildID = 1000 }); | |
| 534 | |
| 535 if (db is DbManager) | |
| 536 Assert.IsTrue(((DbManager)db).LastQuery.Contains("IS NULL")); | |
| 537 | |
| 538 db.Update(new Table3 { ParentID = 10000, ChildID = 111, GrandChildID = 1000 }); | |
| 539 | |
| 540 if (db is DbManager) | |
| 541 Assert.IsFalse(((DbManager)db).LastQuery.Contains("IS NULL")); | |
| 542 } | |
| 543 } | |
| 544 } | |
| 545 } |
