StarSim

StarSim.git
git clone git://git.lenczewski.org/StarSim.git
Log | Files | Refs | README | LICENSE

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:
MStarSim/StarSim/Contexts/SimulatorContextFactory.cs | 4----
MStarSim/StarSim/StarSim.csproj | 12++++++------
MStarSim/StarSimGui/Contexts/SimulatorContextFactory.cs | 4----
MStarSim/StarSimGui/Source/BodyDummy.cs | 9+++++----
MStarSim/StarSimGui/StarSimGui.csproj | 15++++++++++++---
MStarSim/StarSimGui/ViewModels/SimulationViewModel.cs | 148++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
MStarSim/StarSimGui/Views/MainWindow.xaml | 1-
MStarSim/StarSimGui/Views/Simulation.xaml | 18++++++++++++------
MStarSim/StarSimLib/StarSimLib.csproj | 12++++++------
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>