/
OrdersFixture.cs
99 lines (86 loc) · 3.49 KB
/
OrdersFixture.cs
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Data.Entity;
using System.Linq;
using Xunit;
namespace Microsoft.EntityFrameworkCore.Benchmarks.Models.Orders
{
public class OrdersFixture : OrdersFixtureSeedBase
{
private readonly string _connectionString;
private readonly int _productCount;
private readonly int _customerCount;
private readonly int _ordersPerCustomer;
private readonly int _linesPerOrder;
public OrdersFixture(string databaseName, int productCount, int customerCount,
int ordersPerCustomer, int linesPerOrder, Action<DbContext> seedAction = null)
{
_connectionString = $"{BenchmarkEnvironment.Instance.BenchmarkDatabase}Database={databaseName};";
_productCount = productCount;
_customerCount = customerCount;
_ordersPerCustomer = ordersPerCustomer;
_linesPerOrder = linesPerOrder;
EnsureDatabaseCreated(seedAction);
}
public virtual OrdersContext CreateContext()
{
return new OrdersContext(_connectionString);
}
private void EnsureDatabaseCreated(Action<DbContext> seedAction)
{
using (var context = CreateContext())
{
if (!context.Database.Exists())
{
context.Database.Create();
InsertSeedData();
seedAction?.Invoke(context);
}
else if (!IsDatabaseCorrect(context))
{
context.Database.Delete();
context.Database.Create();
InsertSeedData();
seedAction?.Invoke(context);
}
Assert.True(IsDatabaseCorrect(context));
}
}
private bool IsDatabaseCorrect(OrdersContext context)
{
return context.Database.CompatibleWithModel(throwIfNoMetadata: true)
&& _productCount == context.Products.Count()
&& _customerCount == context.Customers.Count()
&& (_customerCount * _ordersPerCustomer == context.Orders.Count())
&& (_customerCount * _ordersPerCustomer * _linesPerOrder == context.OrderLines.Count());
}
private void InsertSeedData()
{
var products = CreateProducts(_productCount, setPrimaryKeys: false);
using (var context = CreateContext())
{
context.Products.AddRange(products);
context.SaveChanges();
}
var customers = CreateCustomers(_customerCount, setPrimaryKeys: false);
using (var context = CreateContext())
{
context.Customers.AddRange(customers);
context.SaveChanges();
}
var orders = CreateOrders(customers, _ordersPerCustomer, setPrimaryKeys: false);
using (var context = CreateContext())
{
context.Orders.AddRange(orders);
context.SaveChanges();
}
var lines = CreateOrderLines(products, orders, _linesPerOrder, setPrimaryKeys: false);
using (var context = CreateContext())
{
context.OrderLines.AddRange(lines);
context.SaveChanges();
}
}
}
}