commit 5dddcedaeecebbcbe2478c8b0914999fd6456148
parent e03310b51cc316b7c13e690e57bae5b699f41db1
Author: Mikolaj Lenczewski <33129490+EnderRifter@users.noreply.github.com>
Date: Wed, 14 Aug 2019 14:56:16 +0200
Updated NuGet packages, cleared remaing regions denoting code subsections in SimulatorContextFactory.cs (in both StarSim and StarSimGui), and reworked Simulation screen for quality of life for users
Diffstat:
9 files changed, 150 insertions(+), 73 deletions(-)
diff --git a/StarSim/StarSim/Contexts/SimulatorContextFactory.cs b/StarSim/StarSim/Contexts/SimulatorContextFactory.cs
@@ -17,8 +17,6 @@ namespace StarSim.Contexts
/// </remarks>
public class SimulatorContextFactory : IDesignTimeDbContextFactory<SimulatorContext>
{
- #region Implementation of IDesignTimeDbContextFactory<out TaxiContext>
-
/// <inheritdoc />
public SimulatorContext CreateDbContext(string[] args)
{
@@ -30,7 +28,5 @@ namespace StarSim.Contexts
return new SimulatorContext(optionsBuilder.Options);
}
-
- #endregion Implementation of IDesignTimeDbContextFactory<out TaxiContext>
}
}
\ No newline at end of file
diff --git a/StarSim/StarSim/StarSim.csproj b/StarSim/StarSim/StarSim.csproj
@@ -7,12 +7,12 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.4">
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
diff --git a/StarSim/StarSimGui/Contexts/SimulatorContextFactory.cs b/StarSim/StarSimGui/Contexts/SimulatorContextFactory.cs
@@ -17,8 +17,6 @@ namespace StarSimGui.Contexts
/// </remarks>
public class SimulatorContextFactory : IDesignTimeDbContextFactory<SimulatorContext>
{
- #region Implementation of IDesignTimeDbContextFactory<out TaxiContext>
-
/// <inheritdoc />
public SimulatorContext CreateDbContext(string[] args)
{
@@ -30,7 +28,5 @@ namespace StarSimGui.Contexts
return new SimulatorContext(optionsBuilder.Options);
}
-
- #endregion Implementation of IDesignTimeDbContextFactory<out TaxiContext>
}
}
\ No newline at end of file
diff --git a/StarSim/StarSimGui/Source/BodyDummy.cs b/StarSim/StarSimGui/Source/BodyDummy.cs
@@ -41,9 +41,9 @@ namespace StarSimGui.Source
{
Generation = body.Generation;
Id = body.Id;
- mass = body.Mass;
- positionVector = body.Position;
- velocityVector = body.Velocity;
+ mass = body.Mass / Constants.SolarMass;
+ positionVector = body.Position / Constants.AstronomicalUnit;
+ velocityVector = body.Velocity / 1000;
}
/// <summary>
@@ -140,7 +140,8 @@ namespace StarSimGui.Source
/// <param name="instance">The <see cref="BodyDummy"/> instance to convert.</param>
public static explicit operator Body(BodyDummy instance)
{
- return new Body(instance.positionVector, instance.velocityVector, instance.Mass, instance.Generation, instance.Id);
+ return new Body(instance.positionVector * Constants.AstronomicalUnit, instance.velocityVector * 1000,
+ instance.Mass * Constants.SolarMass, instance.Generation, instance.Id);
}
}
}
\ No newline at end of file
diff --git a/StarSim/StarSimGui/StarSimGui.csproj b/StarSim/StarSimGui/StarSimGui.csproj
@@ -45,9 +45,18 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="Avalonia" Version="0.8.0" />
- <PackageReference Include="Avalonia.Desktop" Version="0.8.0" />
- <PackageReference Include="Avalonia.ReactiveUI" Version="0.8.0" />
+ <PackageReference Include="Avalonia" Version="0.8.2" />
+ <PackageReference Include="Avalonia.Desktop" Version="0.8.2" />
+ <PackageReference Include="Avalonia.ReactiveUI" Version="0.8.2" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
+ <PrivateAssets>all</PrivateAssets>
+ <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+ </PackageReference>
</ItemGroup>
<ItemGroup>
diff --git a/StarSim/StarSimGui/ViewModels/SimulationViewModel.cs b/StarSim/StarSimGui/ViewModels/SimulationViewModel.cs
@@ -1,10 +1,9 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
-using DynamicData;
using DynamicData.Binding;
-using DynamicData.Cache.Internal;
using ReactiveUI;
using SFML.Graphics;
using SFML.Window;
@@ -24,6 +23,16 @@ namespace StarSimGui.ViewModels
public class SimulationViewModel : ViewModelBase
{
/// <summary>
+ /// The maximum number of bodies that can be generated and that can participate in a simulation.
+ /// </summary>
+ private const int MaxGeneratedBodies = 10_000;
+
+ /// <summary>
+ /// The minimum number of bodies that can be generated and that can participate in a simulation.
+ /// </summary>
+ private const int MinGeneratedBodies = 0;
+
+ /// <summary>
/// The delegate method to use to derive the colour of a body's shape from the body's mass.
/// </summary>
private readonly MassToColourDelegate bodyMassToColourDelegate = BodyGenerator.DefaultColourDelegate;
@@ -46,7 +55,7 @@ namespace StarSimGui.ViewModels
/// <summary>
/// The dummy body holding the field values for the generated <see cref="Body"/> instance.
/// </summary>
- private BodyDummy currentBodyDummy;
+ private BodyDummy currentBodyDummy = new BodyDummy();
/// <summary>
/// The current simulation.
@@ -61,12 +70,7 @@ namespace StarSimGui.ViewModels
/// <summary>
/// The backing field for the <see cref="SelectedItemIndex"/> property.
/// </summary>
- private int selectedItemIndex = 0;
-
- /// <summary>
- /// The bodies that will participate in the simulation.
- /// </summary>
- private List<Body> simulatedBodies;
+ private int selectedItemIndex;
/// <summary>
/// The backing field for the <see cref="SimulatedBodies"/> property.
@@ -79,7 +83,7 @@ namespace StarSimGui.ViewModels
private int simulatedBodyCount = Constants.BodyCount;
/// <summary>
- /// Maps the bodies participating in the simulation to their shapes that will be rendered to represent them.
+ /// Holds the circle shapes for the bodies participating in the simulation.
/// </summary>
private Dictionary<Body, CircleShape> simulatedBodyShapes;
@@ -98,20 +102,35 @@ namespace StarSimGui.ViewModels
{
dbContext = context;
- simulatedBodies = new List<Body>();
-
- simulatedBodiesObservable = new ObservableCollectionExtended<Body>(simulatedBodies);
+ simulatedBodiesObservable = new ObservableCollectionExtended<Body>();
IObservable<bool> canAddBody =
this.WhenAnyValue(x => x.CurrentBody, selector: body => !body?.Equals(new BodyDummy()) ?? false);
AddBodyCommand = ReactiveCommand.Create(AddBodyCommandImpl, canAddBody);
+ IObservable<bool> canClearBodies =
+ this.WhenAnyValue(x => x.SimulatedBodies, selector: bodies => bodies != null);
+
+ ClearBodiesCommand = ReactiveCommand.Create(ClearBodiesCommandImpl, canClearBodies);
+
+ IObservable<bool> canCopyBody =
+ this.WhenAnyValue(x => x.SelectedItemIndex, x => x.CurrentBody,
+ (index, dummy) => index > -1 && (!dummy?.Equals(new BodyDummy()) ?? false));
+
+ CopyBodyCommand = ReactiveCommand.Create(CopyBodyCommandImpl, canCopyBody);
+
IObservable<bool> canDeleteBody =
this.WhenAnyValue(x => x.CurrentBody, selector: body => !body?.Equals(new BodyDummy()) ?? false);
DeleteBodyCommand = ReactiveCommand.Create(DeleteBodyCommandImpl, canDeleteBody);
+ IObservable<bool> canDeselectBody =
+ this.WhenAnyValue(x => x.SelectedItemIndex, x => x.CurrentBody,
+ (index, dummy) => index > -1 && (!dummy?.Equals(new BodyDummy()) ?? false));
+
+ DeselectBodyCommand = ReactiveCommand.Create(DeselectBodyCommandImpl, canDeselectBody);
+
GenerateBodiesCommand = ReactiveCommand.Create(GenerateBodiesCommandImpl);
IObservable<bool> currentSimulationInactive =
@@ -120,18 +139,30 @@ namespace StarSimGui.ViewModels
StartSimulationCommand =
ReactiveCommand.CreateFromTask(StartSimulationCommandImpl, currentSimulationInactive);
- IObservable<bool> canUpdateBody = this.WhenAnyValue(x => x.CurrentBody, x => x.SelectedItemIndex,
- (body, selectedIndex) => (!body?.Equals(new BodyDummy()) ?? false) && selectedIndex >= 0 && selectedIndex < 10_000);
+ IObservable<bool> canUpdateBody =
+ this.WhenAnyValue(x => x.CurrentBody, x => x.SelectedItemIndex,
+ (body, selectedIndex) => (!body?.Equals(new BodyDummy()) ?? false) && selectedIndex > -1 &&
+ selectedIndex < MaxGeneratedBodies - MinGeneratedBodies);
UpdateBodyCommand = ReactiveCommand.Create(UpdateBodyCommandImpl, canUpdateBody);
}
/// <summary>
- /// Command invoked whenever the currently inspected body should be added to the <see cref="simulatedBodies"/> collection.
+ /// Command invoked whenever the currently inspected body should be added to the <see cref="SimulatedBodies"/> collection.
/// </summary>
public ICommand AddBodyCommand { get; }
/// <summary>
+ /// Command invoked whenever the user wants to clear the <see cref="SimulatedBodies"/> collection.
+ /// </summary>
+ public ICommand ClearBodiesCommand { get; }
+
+ /// <summary>
+ /// Command invoked whenever the currently selected body should be added again to the <see cref="SimulatedBodies"/> collection.
+ /// </summary>
+ public ICommand CopyBodyCommand { get; }
+
+ /// <summary>
/// The <see cref="Body"/> instance currently selected for editing or viewing.
/// </summary>
public BodyDummy CurrentBody
@@ -164,11 +195,16 @@ namespace StarSimGui.ViewModels
}
/// <summary>
- /// Command invoked whenever the currently inspected body should be deleted from the <see cref="simulatedBodies"/> collection.
+ /// Command invoked whenever the currently inspected body should be deleted from the <see cref="SimulatedBodies"/> collection.
/// </summary>
public ICommand DeleteBodyCommand { get; }
/// <summary>
+ /// Command invoked whenever the user wants to deselect the currently selected body.
+ /// </summary>
+ public ICommand DeselectBodyCommand { get; }
+
+ /// <summary>
/// Command invoked whenever the user wants to generate a new collection.
/// </summary>
public ICommand GenerateBodiesCommand { get; }
@@ -189,8 +225,7 @@ namespace StarSimGui.ViewModels
if (selectedItemIndex >= 0)
{
- currentBodyDummy = new BodyDummy(simulatedBodiesObservable?[selectedItemIndex]);
- this.RaisePropertyChanged(nameof(CurrentBody));
+ CurrentBody = new BodyDummy(SimulatedBodies?[value]);
}
}
}
@@ -248,12 +283,42 @@ namespace StarSimGui.ViewModels
private void AddBodyCommandImpl()
{
CurrentBody.Generation = BodyGenerator.CurrentGeneration;
- CurrentBody.Id = simulatedBodiesObservable[simulatedBodiesObservable.Count - 1].Id + 1;
+
+ if (SimulatedBodies.Count > 0)
+ {
+ CurrentBody.Id = SimulatedBodies[SimulatedBodies.Count - 1].Id + 1;
+ }
+ else
+ {
+ CurrentBody.Id = 0;
+ }
+
+ Body currentBody = (Body)CurrentBody;
+
+ SimulatedBodies.Add(currentBody);
+
+ CurrentBody = new BodyDummy();
+ }
+
+ /// <summary>
+ /// Invoked whenever the user wants to clear the <see cref="SimulatedBodies"/> collection.
+ /// </summary>
+ private void ClearBodiesCommandImpl()
+ {
+ SimulatedBodies.Clear();
+ }
+
+ /// <summary>
+ /// Invoked whenever the user wants to re-add the currently selected body to the <see cref="SimulatedBodies"/> collection.
+ /// </summary>
+ private void CopyBodyCommandImpl()
+ {
+ CurrentBody.Generation = BodyGenerator.CurrentGeneration;
+ CurrentBody.Id = SimulatedBodies[SimulatedBodies.Count - 1].Id + 1;
Body currentBody = (Body)CurrentBody;
- simulatedBodies.Add(currentBody);
- simulatedBodiesObservable.Add(currentBody);
+ SimulatedBodies.Add(currentBody);
}
/// <summary>
@@ -261,29 +326,35 @@ namespace StarSimGui.ViewModels
/// </summary>
private void DeleteBodyCommandImpl()
{
- simulatedBodies.RemoveAt(selectedItemIndex);
- simulatedBodiesObservable.RemoveAt(selectedItemIndex);
+ SimulatedBodies.RemoveAt(SelectedItemIndex);
CurrentBody = new BodyDummy();
}
/// <summary>
+ /// Invoked whenever the user wants to deselect the currently selected body.
+ /// </summary>
+ private void DeselectBodyCommandImpl()
+ {
+ SelectedItemIndex = -1;
+ CurrentBody = new BodyDummy();
+ }
+
+ /// <summary>
/// Invoked whenever the user wants to generate a new set of bodies to simulate.
/// </summary>
private void GenerateBodiesCommandImpl()
{
- if (SimulatedBodyCount < 0 || SimulatedBodyCount > 10_000)
+ if (SimulatedBodyCount < MinGeneratedBodies || SimulatedBodyCount > MaxGeneratedBodies)
{
// we cannot generate a negative number of bodies, and we cannot reliably simulate more than 10 000 bodies
return;
}
- simulatedBodies = new List<Body>(BodyGenerator.GenerateBodies(SimulatedBodyCount, SimulateCentralAttractor));
-
- simulatedBodiesObservable.Load(simulatedBodies);
+ SimulatedBodies.Load(BodyGenerator.GenerateBodies(SimulatedBodyCount, SimulateCentralAttractor));
simulatedBodyShapes =
- BodyGenerator.GenerateShapes(simulatedBodies, bodyMassToRadiusDelegate, bodyMassToColourDelegate);
+ BodyGenerator.GenerateShapes(SimulatedBodies, bodyMassToRadiusDelegate, bodyMassToColourDelegate);
}
/// <summary>
@@ -291,7 +362,7 @@ namespace StarSimGui.ViewModels
/// </summary>
private async Task StartSimulationCommandImpl()
{
- Body[] simulatedBodiesArr = simulatedBodies.ToArray();
+ Body[] simulatedBodiesArr = SimulatedBodies.ToArray();
IInputHandler simulationInputHandler = new SimulationInputHandler(ref simulatedBodiesArr);
@@ -318,6 +389,14 @@ namespace StarSimGui.ViewModels
}
/// <summary>
+ /// Invoked whenever the user wants to update the currently edited body.
+ /// </summary>
+ private void UpdateBodyCommandImpl()
+ {
+ SimulatedBodies[SelectedItemIndex] = (Body)CurrentBody;
+ }
+
+ /// <summary>
/// Handles the <see cref="UserLoginViewModel.LoggedIn"/> event.
/// </summary>
/// <param name="newUser">The user which logged in.</param>
@@ -333,14 +412,5 @@ namespace StarSimGui.ViewModels
{
CurrentUser = null;
}
-
- /// <summary>
- /// Invoked whenever the user wants to update the currently edited body.
- /// </summary>
- public void UpdateBodyCommandImpl()
- {
- simulatedBodies[selectedItemIndex] = (Body)CurrentBody;
- simulatedBodiesObservable[selectedItemIndex] = (Body)CurrentBody;
- }
}
}
\ No newline at end of file
diff --git a/StarSim/StarSimGui/Views/MainWindow.xaml b/StarSim/StarSimGui/Views/MainWindow.xaml
@@ -4,7 +4,6 @@
xmlns:v="clr-namespace:StarSimGui.Views;assembly=StarSimGui"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="StarSimGui.Views.MainWindow"
Icon="/Assets/avalonia-logo.ico"
Title="Star Simulation - Mikołaj Lenczewski"
diff --git a/StarSim/StarSimGui/Views/Simulation.xaml b/StarSim/StarSimGui/Views/Simulation.xaml
@@ -13,27 +13,31 @@
</Design.DataContext>
<Border BorderBrush="Gray" BorderThickness="2" CornerRadius="2" Margin="2">
- <Grid ColumnDefinitions="*,*,*,*" RowDefinitions="*,*,*,*">
+ <Grid ColumnDefinitions="300,*,*,*" RowDefinitions="200,*,*,*">
<Border BorderBrush="Gray" BorderThickness="2" Margin="2" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1">
- <StackPanel>
+ <StackPanel VerticalAlignment="Stretch">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Have Central Attractor:</TextBlock>
+ <Separator Margin="1" />
<CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding SimulateCentralAttractor, Mode=TwoWay}"></CheckBox>
<Separator Margin="2" />
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">Simulated Body Count:</TextBlock>
+ <Separator Margin="1" />
<TextBox VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding SimulatedBodyCount, Mode=TwoWay}"></TextBox>
</StackPanel>
<Button Command="{Binding StartSimulationCommand}" Content="Start Simulation" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
- <Button Command="{Binding AddBodyCommand}" Content="Add Selected Body" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
+ <Button Command="{Binding AddBodyCommand}" Content="Add New Body" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
+ <Button Command="{Binding CopyBodyCommand}" Content="Copy Selected Body" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
<Button Command="{Binding DeleteBodyCommand}" Content="Delete Selected Body" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
<Button Command="{Binding GenerateBodiesCommand}" Content="Generate Random Bodies" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
+ <Button Command="{Binding ClearBodiesCommand}" Content="Clear Generated Bodies" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
</StackPanel>
</Border>
<Border BorderBrush="Gray" BorderThickness="2" Margin="2" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="1" Grid.RowSpan="3">
<StackPanel Margin="2" DataContext="{Binding CurrentBody}">
- <TextBlock HorizontalAlignment="Center">Mass (Kilograms)</TextBlock>
+ <TextBlock HorizontalAlignment="Center">Mass (Solar Masses)</TextBlock>
<TextBox HorizontalAlignment="Stretch" Text="{Binding Mass, Mode=TwoWay}"></TextBox>
- <TextBlock HorizontalAlignment="Center">Position (Metres)</TextBlock>
+ <TextBlock HorizontalAlignment="Center">Position (Astronomical Units)</TextBlock>
<TextBlock Text="X:"></TextBlock>
<TextBox HorizontalAlignment="Stretch" Text="{Binding PosX, Mode=TwoWay}"></TextBox>
<TextBlock Text="Y:"></TextBlock>
@@ -41,7 +45,7 @@
<TextBlock Text="Z:"></TextBlock>
<TextBox HorizontalAlignment="Stretch" Text="{Binding PosZ, Mode=TwoWay}"></TextBox>
<Separator Margin="2" />
- <TextBlock HorizontalAlignment="Center">Velocity (Metres per Second)</TextBlock>
+ <TextBlock HorizontalAlignment="Center">Velocity (Kilometres per Second)</TextBlock>
<TextBlock Text="X:"></TextBlock>
<TextBox HorizontalAlignment="Stretch" Text="{Binding VelX, Mode=TwoWay}"></TextBox>
<TextBlock Text="Y:"></TextBlock>
@@ -50,6 +54,8 @@
<TextBox HorizontalAlignment="Stretch" Text="{Binding VelZ, Mode=TwoWay}"></TextBox>
<Separator Margin="2" />
<Button Command="{Binding $parent[1].DataContext.UpdateBodyCommand}" Content="Update Edited Body" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
+ <Separator Margin="2" />
+ <Button Command="{Binding $parent[1].DataContext.UpdateBodyCommand}" Content="Deselect Body" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
</StackPanel>
</Border>
<Border BorderBrush="Gray" BorderThickness="2" Margin="2" Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="4">
diff --git a/StarSim/StarSimLib/StarSimLib.csproj b/StarSim/StarSimLib/StarSimLib.csproj
@@ -30,12 +30,12 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.4" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.4">
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>