Skip to content

Commit ab47d77

Browse files
authored
Merge pull request #13 from claudiopi/cpi/sqlite
Add SQLite support
2 parents 53c6c14 + 775603b commit ab47d77

File tree

4 files changed

+169
-142
lines changed

4 files changed

+169
-142
lines changed

NorthwindCRUD/Helpers/DBSeeder.cs

Lines changed: 151 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
namespace NorthwindCRUD.Helpers
22
{
3-
using Microsoft.AspNetCore.JsonPatch.Internal;
43
using Microsoft.EntityFrameworkCore;
54
using Newtonsoft.Json;
65
using NorthwindCRUD.Models.DbModels;
@@ -15,175 +14,197 @@ public static void Seed(DataContext dbContext)
1514
var transaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.Serializable);
1615
try
1716
{
18-
if (dbContext.Database.ProviderName == "Microsoft.EntityFrameworkCore.SqlServer")
19-
{
20-
dbContext.Database.ExecuteSqlRaw("EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'");
21-
}
22-
// Seed Categories
23-
if (!dbContext.Categories.Any())
24-
{
25-
var categoriesData = File.ReadAllText("./Resources/categories.json");
26-
var parsedCategories = JsonConvert.DeserializeObject<CategoryDb[]>(categoriesData);
17+
SeedCategories(dbContext);
18+
SeedRegions(dbContext);
19+
SeedTerritories(dbContext);
20+
SeedSuppliers(dbContext);
21+
SeedProducts(dbContext);
22+
SeedShippers(dbContext);
23+
SeedEmployees(dbContext);
24+
SeedCustomers(dbContext);
25+
SeedOrders(dbContext);
26+
SeedEmployeesTerritories(dbContext);
2727

28-
dbContext.Categories.AddRange(parsedCategories);
29-
dbContext.SaveChanges();
30-
}
31-
32-
// Seed Customers
33-
if (!dbContext.Customers.Any())
34-
{
35-
var customersData = File.ReadAllText("./Resources/customers.json");
36-
var parsedCustomers = JsonConvert.DeserializeObject<CustomerDb[]>(customersData);
28+
transaction.Commit();
29+
}
30+
catch (Exception error)
31+
{
32+
transaction.Rollback();
33+
throw;
34+
}
35+
}
3736

38-
foreach (var customer in parsedCustomers)
39-
{
40-
if (dbContext.Addresses.FirstOrDefault(a => a.Street == customer.Address.Street) == null)
41-
{
42-
dbContext.Addresses.Add(customer.Address);
43-
}
44-
dbContext.Customers.Add(customer);
45-
}
46-
dbContext.SaveChanges();
47-
}
37+
private static void SeedEmployeesTerritories(DataContext dbContext)
38+
{
39+
if (!dbContext.EmployeesTerritories.Any())
40+
{
41+
var employeesTerritoriesData = File.ReadAllText("./Resources/employees-territories.json");
42+
var parsedEmployeesTerritories = JsonConvert.DeserializeObject<EmployeeTerritoryDb[]>(employeesTerritoriesData);
4843

49-
// Seed Employees
50-
if (!dbContext.Employees.Any())
51-
{
52-
var employeesData = File.ReadAllText("./Resources/employees.json");
53-
var parsedEmployees = JsonConvert.DeserializeObject<EmployeeDb[]>(employeesData);
44+
dbContext.EmployeesTerritories.AddRange(parsedEmployeesTerritories);
45+
dbContext.SaveChanges();
46+
}
47+
}
5448

55-
foreach (var employee in parsedEmployees)
56-
{
57-
if (dbContext.Addresses.FirstOrDefault(a => a.Street == employee.Address.Street) == null)
58-
{
59-
dbContext.Addresses.Add(employee.Address);
60-
}
61-
dbContext.Employees.Add(employee);
62-
}
63-
dbContext.SaveChanges();
64-
}
49+
private static void SeedSuppliers(DataContext dbContext)
50+
{
51+
if (!dbContext.Suppliers.Any())
52+
{
53+
var suppliersData = File.ReadAllText("./Resources/suppliers.json");
54+
var parsedSuppliers = JsonConvert.DeserializeObject<SupplierDb[]>(suppliersData);
6555

66-
// Seed Orders
67-
if (!dbContext.Orders.Any())
56+
foreach (var supplier in parsedSuppliers)
6857
{
69-
var ordersData = File.ReadAllText("./Resources/orders.json");
70-
var parsedOrders = JsonConvert.DeserializeObject<OrderDb[]>(ordersData);
58+
var matchingProducts = dbContext.Products.Where(p => p.SupplierId == supplier.SupplierId).ToList();
59+
supplier.Products = matchingProducts;
7160

72-
foreach (var order in parsedOrders)
73-
{
74-
if (dbContext.Addresses.FirstOrDefault(a => a.Street == order.ShipAddress.Street) == null)
75-
{
76-
dbContext.Addresses.Add(order.ShipAddress);
77-
}
78-
79-
if (!dbContext.OrderDetails.Any(o => o.OrderId == order.OrderId))
80-
{
81-
var orderDetailsData = order.Details.ToList();
61+
dbContext.Suppliers.Add(supplier);
62+
}
8263

83-
orderDetailsData.ForEach(o =>
84-
{
85-
o.OrderId = order.OrderId;
86-
});
64+
dbContext.SaveChanges();
65+
}
66+
}
8767

88-
dbContext.OrderDetails.AddRange(order.Details);
89-
}
68+
private static void SeedShippers(DataContext dbContext)
69+
{
70+
if (!dbContext.Shippers.Any())
71+
{
72+
var shippersData = File.ReadAllText("./Resources/shippers.json");
73+
var parsedShippers = JsonConvert.DeserializeObject<ShipperDb[]>(shippersData);
74+
foreach (var shipper in parsedShippers)
75+
{
76+
var matchingOrders = dbContext.Orders.Where(o => o.ShipperId == shipper.ShipperId).ToList();
77+
shipper.Orders = matchingOrders;
9078

91-
dbContext.Orders.Add(order);
92-
}
93-
dbContext.SaveChanges();
79+
dbContext.Shippers.Add(shipper);
9480
}
9581

96-
//Seed Products
97-
if (!dbContext.Products.Any())
98-
{
99-
var productsData = File.ReadAllText("./Resources/products.json");
100-
var parsedProducts = JsonConvert.DeserializeObject<ProductDb[]>(productsData);
82+
dbContext.SaveChanges();
83+
}
84+
}
10185

102-
dbContext.Products.AddRange(parsedProducts);
103-
dbContext.SaveChanges();
104-
}
86+
private static void SeedTerritories(DataContext dbContext)
87+
{
88+
if (!dbContext.Territories.Any())
89+
{
90+
var territoriesData = File.ReadAllText("./Resources/territories.json");
91+
var parsedTerritories = JsonConvert.DeserializeObject<TerritoryDb[]>(territoriesData);
10592

106-
//Seed Territories
107-
if (!dbContext.Territories.Any())
108-
{
109-
var territoriesData = File.ReadAllText("./Resources/territories.json");
110-
var parsedTerritories = JsonConvert.DeserializeObject<TerritoryDb[]>(territoriesData);
93+
dbContext.Territories.AddRange(parsedTerritories);
94+
dbContext.SaveChanges();
95+
}
96+
}
11197

112-
dbContext.Territories.AddRange(parsedTerritories);
113-
dbContext.SaveChanges();
114-
}
98+
private static void SeedOrders(DataContext dbContext)
99+
{
100+
if (!dbContext.Orders.Any())
101+
{
102+
var ordersData = File.ReadAllText("./Resources/orders.json");
103+
var parsedOrders = JsonConvert.DeserializeObject<OrderDb[]>(ordersData);
115104

116-
//Seed Regions
117-
if (!dbContext.Regions.Any())
105+
foreach (var order in parsedOrders)
118106
{
119-
var productsData = File.ReadAllText("./Resources/regions.json");
120-
var parsedRegions = JsonConvert.DeserializeObject<RegionDb[]>(productsData);
121-
107+
if (dbContext.Addresses.FirstOrDefault(a => a.Street == order.ShipAddress.Street) == null)
108+
{
109+
dbContext.Addresses.Add(order.ShipAddress);
110+
}
122111

123-
foreach (var region in parsedRegions)
112+
if (!dbContext.OrderDetails.Any(o => o.OrderId == order.OrderId))
124113
{
125-
var matchingTerritories = dbContext.Territories.Where(t => t.RegionId == region.RegionId).ToList();
126-
region.Territories = matchingTerritories;
114+
var orderDetailsData = order.Details.ToList();
127115

128-
dbContext.Regions.Add(region);
116+
orderDetailsData.ForEach(o =>
117+
{
118+
o.OrderId = order.OrderId;
119+
});
120+
121+
dbContext.OrderDetails.AddRange(order.Details);
129122
}
130-
dbContext.SaveChanges();
123+
124+
dbContext.Orders.Add(order);
131125
}
126+
dbContext.SaveChanges();
127+
}
128+
}
129+
130+
private static void SeedEmployees(DataContext dbContext)
131+
{
132+
if (!dbContext.Employees.Any())
133+
{
134+
var employeesData = File.ReadAllText("./Resources/employees.json");
135+
var parsedEmployees = JsonConvert.DeserializeObject<EmployeeDb[]>(employeesData);
132136

133-
//Seed Shippers
134-
if (!dbContext.Shippers.Any())
137+
foreach (var employee in parsedEmployees)
135138
{
136-
var shippersData = File.ReadAllText("./Resources/shippers.json");
137-
var parsedShippers = JsonConvert.DeserializeObject<ShipperDb[]>(shippersData);
138-
foreach (var shipper in parsedShippers)
139+
if (dbContext.Addresses.FirstOrDefault(a => a.Street == employee.Address.Street) == null)
139140
{
140-
var matchingOrders = dbContext.Orders.Where(o => o.ShipperId == shipper.ShipperId).ToList();
141-
shipper.Orders = matchingOrders;
142-
143-
dbContext.Shippers.Add(shipper);
141+
dbContext.Addresses.Add(employee.Address);
144142
}
145-
146-
dbContext.SaveChanges();
143+
dbContext.Employees.Add(employee);
147144
}
145+
dbContext.SaveChanges();
146+
}
147+
}
148148

149-
//Seed Suppliers
150-
if (!dbContext.Suppliers.Any())
151-
{
152-
var suppliersData = File.ReadAllText("./Resources/suppliers.json");
153-
var parsedSuppliers = JsonConvert.DeserializeObject<SupplierDb[]>(suppliersData);
149+
private static void SeedCustomers(DataContext dbContext)
150+
{
151+
if (!dbContext.Customers.Any())
152+
{
153+
var customersData = File.ReadAllText("./Resources/customers.json");
154+
var parsedCustomers = JsonConvert.DeserializeObject<CustomerDb[]>(customersData);
154155

155-
foreach (var supplier in parsedSuppliers)
156+
foreach (var customer in parsedCustomers)
157+
{
158+
if (dbContext.Addresses.FirstOrDefault(a => a.Street == customer.Address.Street) == null)
156159
{
157-
var matchingProducts = dbContext.Products.Where(p => p.SupplierId == supplier.SupplierId).ToList();
158-
supplier.Products = matchingProducts;
159-
160-
dbContext.Suppliers.Add(supplier);
160+
dbContext.Addresses.Add(customer.Address);
161161
}
162-
163-
dbContext.SaveChanges();
162+
dbContext.Customers.Add(customer);
164163
}
164+
dbContext.SaveChanges();
165+
}
166+
}
165167

166-
//Seed EmployeesTeritories
167-
if (!dbContext.EmployeesTerritories.Any())
168-
{
169-
var employeesTerritoriesData = File.ReadAllText("./Resources/employees-territories.json");
170-
var parsedEmployeesTerritories = JsonConvert.DeserializeObject<EmployeeTerritoryDb[]>(employeesTerritoriesData);
168+
private static void SeedProducts(DataContext dbContext)
169+
{
170+
if (!dbContext.Products.Any())
171+
{
172+
var productsData = File.ReadAllText("./Resources/products.json");
173+
var parsedProducts = JsonConvert.DeserializeObject<ProductDb[]>(productsData);
171174

172-
dbContext.EmployeesTerritories.AddRange(parsedEmployeesTerritories);
173-
dbContext.SaveChanges();
174-
}
175+
dbContext.Products.AddRange(parsedProducts);
176+
dbContext.SaveChanges();
177+
}
178+
}
179+
180+
private static void SeedRegions(DataContext dbContext)
181+
{
182+
if (!dbContext.Regions.Any())
183+
{
184+
var productsData = File.ReadAllText("./Resources/regions.json");
185+
var parsedRegions = JsonConvert.DeserializeObject<RegionDb[]>(productsData);
175186

176-
transaction.Commit();
177187

178-
if (dbContext.Database.ProviderName == "Microsoft.EntityFrameworkCore.SqlServer")
188+
foreach (var region in parsedRegions)
179189
{
180-
dbContext.Database.ExecuteSqlRaw("EXEC sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'");
190+
var matchingTerritories = dbContext.Territories.Where(t => t.RegionId == region.RegionId).ToList();
191+
region.Territories = matchingTerritories;
192+
193+
dbContext.Regions.Add(region);
181194
}
195+
dbContext.SaveChanges();
182196
}
183-
catch (Exception error)
197+
}
198+
199+
private static void SeedCategories(DataContext dbContext)
200+
{
201+
if (!dbContext.Categories.Any())
184202
{
185-
transaction.Rollback();
186-
throw;
203+
var categoriesData = File.ReadAllText("./Resources/categories.json");
204+
var parsedCategories = JsonConvert.DeserializeObject<CategoryDb[]>(categoriesData);
205+
206+
dbContext.Categories.AddRange(parsedCategories);
207+
dbContext.SaveChanges();
187208
}
188209
}
189210
}

NorthwindCRUD/NorthwindCRUD.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2020
</PackageReference>
2121
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.11" />
22+
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.22" />
2223
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.8" />
2324
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.8">
2425
<PrivateAssets>all</PrivateAssets>

NorthwindCRUD/Program.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
using NorthwindCRUD.Services;
1212
using System.Text;
1313
using NorthwindCRUD.Filters;
14+
using Microsoft.Data.Sqlite;
15+
using Microsoft.Extensions.Options;
1416

1517
var builder = WebApplication.CreateBuilder(args);
1618
var AllowAnyOriginPolicy = "_allowAnyOrigin";
@@ -53,19 +55,17 @@
5355
});
5456

5557
var dbProvider = builder.Configuration.GetConnectionString("Provider");
56-
57-
builder.Services.AddDbContext<DataContext>(options =>
58+
if (dbProvider == "SQLite")
5859
{
60+
// For SQLite in memory to be shared across multiple EF calls, we need to maintain a separate open connection.
61+
// see post https://stackoverflow.com/questions/56319638/entityframeworkcore-sqlite-in-memory-db-tables-are-not-created
62+
var keepAliveConnection = new SqliteConnection(builder.Configuration.GetConnectionString("SQLiteConnectionString"));
63+
keepAliveConnection.Open();
64+
}
5965

60-
if (dbProvider == "SqlServer")
61-
{
62-
options.UseSqlServer(builder.Configuration.GetConnectionString("SqlServerConnectionString"));
63-
}
64-
else if (dbProvider == "InMemory")
65-
{
66-
options.UseInMemoryDatabase(databaseName: builder.Configuration.GetConnectionString("InMemoryDBConnectionString"));
67-
}
6866

67+
builder.Services.AddDbContext<DataContext>(options =>
68+
{
6969
if (dbProvider == "SqlServer")
7070
{
7171
options.UseSqlServer(builder.Configuration.GetConnectionString("SqlServerConnectionString"));
@@ -79,6 +79,10 @@
7979

8080
options.UseInMemoryDatabase(databaseName: builder.Configuration.GetConnectionString("InMemoryDBConnectionString"));
8181
}
82+
else if (dbProvider == "SQLite")
83+
{
84+
options.UseSqlite(builder.Configuration.GetConnectionString("SQLiteConnectionString"));
85+
}
8286
});
8387

8488
var serviceProvider = builder.Services.BuildServiceProvider();

0 commit comments

Comments
 (0)