From 74022c737a50e3d2b1f31b2488bef8ee54093844 Mon Sep 17 00:00:00 2001 From: SergeevaAA <aas189@tpu.ru> Date: Fri, 23 Oct 2020 21:56:15 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=20=D1=81=20=D0=91=D0=94=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20-=20=D0=A3?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=BE=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2=20-=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20-=20=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=91=D0=94=20-?= =?UTF-8?q?=20=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B0=20=D0=BC=D0=B8?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86=20=D0=B2=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/FileDesk.DataAccess/Class1.cs | 8 -- .../FileDesk.DataAccess.csproj | 18 ++++ ..._FilesAndDownloadsTablesCreate.Designer.cs | 88 +++++++++++++++++++ ...023144738_FilesAndDownloadsTablesCreate.cs | 63 +++++++++++++ .../FileDeskContextModelSnapshot.cs | 87 ++++++++++++++++++ .../Repository/FileDeskContext.cs | 49 +++++++++++ .../FileDesk.Domain/Models/AbstractEntity.cs | 1 + source/FileDesk.Domain/Models/Download.cs | 7 +- source/FileDesk.Domain/Models/File.cs | 26 +++++- source/FileDesk.Web/FileDesk.Web.csproj | 12 +++ source/FileDesk.Web/Startup.cs | 20 ++--- source/FileDesk.Web/appsettings.json | 3 + 12 files changed, 359 insertions(+), 23 deletions(-) delete mode 100644 source/FileDesk.DataAccess/Class1.cs create mode 100644 source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.Designer.cs create mode 100644 source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.cs create mode 100644 source/FileDesk.DataAccess/Migrations/FileDeskContextModelSnapshot.cs create mode 100644 source/FileDesk.DataAccess/Repository/FileDeskContext.cs diff --git a/source/FileDesk.DataAccess/Class1.cs b/source/FileDesk.DataAccess/Class1.cs deleted file mode 100644 index 6c3ed65..0000000 --- a/source/FileDesk.DataAccess/Class1.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace FileDesk.DataAccess -{ - public class Class1 - { - } -} diff --git a/source/FileDesk.DataAccess/FileDesk.DataAccess.csproj b/source/FileDesk.DataAccess/FileDesk.DataAccess.csproj index cb63190..e3b322b 100644 --- a/source/FileDesk.DataAccess/FileDesk.DataAccess.csproj +++ b/source/FileDesk.DataAccess/FileDesk.DataAccess.csproj @@ -4,4 +4,22 @@ <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> + <ItemGroup> + <Folder Include="Migrations\" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.9" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.9" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.9" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.9"> + <PrivateAssets>all</PrivateAssets> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + </PackageReference> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\FileDesk.Domain\FileDesk.Domain.csproj" /> + </ItemGroup> + </Project> diff --git a/source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.Designer.cs b/source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.Designer.cs new file mode 100644 index 0000000..c7715a5 --- /dev/null +++ b/source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.Designer.cs @@ -0,0 +1,88 @@ +// <auto-generated /> +using System; +using FileDesk.DataAccess.Repository; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace FileDesk.DataAccess.Migrations +{ + [DbContext(typeof(FileDeskContext))] + [Migration("20201023144738_FilesAndDownloadsTablesCreate")] + partial class FilesAndDownloadsTablesCreate + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("FileDesk.Domain.Models.Download", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property<DateTime>("DateTime") + .HasColumnType("datetime2"); + + b.Property<long>("FileId") + .HasColumnType("bigint"); + + b.Property<string>("IpAddress") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Downloads"); + }); + + modelBuilder.Entity("FileDesk.Domain.Models.File", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property<byte[]>("Content") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property<string>("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property<int>("Format") + .HasColumnType("int"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property<DateTime>("UploadDateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("FileDesk.Domain.Models.Download", b => + { + b.HasOne("FileDesk.Domain.Models.File", "File") + .WithMany("Downloads") + .HasForeignKey("FileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.cs b/source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.cs new file mode 100644 index 0000000..d973bd8 --- /dev/null +++ b/source/FileDesk.DataAccess/Migrations/20201023144738_FilesAndDownloadsTablesCreate.cs @@ -0,0 +1,63 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace FileDesk.DataAccess.Migrations +{ + public partial class FilesAndDownloadsTablesCreate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Files", + columns: table => new + { + Id = table.Column<long>(nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column<string>(nullable: false), + Description = table.Column<string>(nullable: false), + UploadDateTime = table.Column<DateTime>(nullable: false), + Content = table.Column<byte[]>(nullable: false), + Format = table.Column<int>(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Files", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Downloads", + columns: table => new + { + Id = table.Column<long>(nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + FileId = table.Column<long>(nullable: false), + DateTime = table.Column<DateTime>(nullable: false), + IpAddress = table.Column<string>(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Downloads", x => x.Id); + table.ForeignKey( + name: "FK_Downloads_Files_FileId", + column: x => x.FileId, + principalTable: "Files", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Downloads_FileId", + table: "Downloads", + column: "FileId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Downloads"); + + migrationBuilder.DropTable( + name: "Files"); + } + } +} \ No newline at end of file diff --git a/source/FileDesk.DataAccess/Migrations/FileDeskContextModelSnapshot.cs b/source/FileDesk.DataAccess/Migrations/FileDeskContextModelSnapshot.cs new file mode 100644 index 0000000..11c79d4 --- /dev/null +++ b/source/FileDesk.DataAccess/Migrations/FileDeskContextModelSnapshot.cs @@ -0,0 +1,87 @@ +// <auto-generated /> +using System; +using FileDesk.DataAccess.Repository; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace FileDesk.DataAccess.Migrations +{ + [DbContext(typeof(FileDeskContext))] + partial class FileDeskContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("FileDesk.Domain.Models.Download", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property<DateTime>("DateTime") + .HasColumnType("datetime2"); + + b.Property<long>("FileId") + .HasColumnType("bigint"); + + b.Property<string>("IpAddress") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Downloads"); + }); + + modelBuilder.Entity("FileDesk.Domain.Models.File", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property<byte[]>("Content") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property<string>("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property<int>("Format") + .HasColumnType("int"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property<DateTime>("UploadDateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("FileDesk.Domain.Models.Download", b => + { + b.HasOne("FileDesk.Domain.Models.File", "File") + .WithMany("Downloads") + .HasForeignKey("FileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/source/FileDesk.DataAccess/Repository/FileDeskContext.cs b/source/FileDesk.DataAccess/Repository/FileDeskContext.cs new file mode 100644 index 0000000..2db4ac4 --- /dev/null +++ b/source/FileDesk.DataAccess/Repository/FileDeskContext.cs @@ -0,0 +1,49 @@ +namespace FileDesk.DataAccess.Repository +{ + using FileDesk.Domain.Models; + using Microsoft.EntityFrameworkCore; + using System.Linq; + using System.Reflection; + + /// <summary> + /// Класс для работы с БД + /// </summary> + public class FileDeskContext : DbContext + { + /// <summary> + /// Создает новый экземпляр класса <see cref="FileDeskContext"/> + /// </summary> + public FileDeskContext() { } + + /// <summary> + /// Создает новый экземпляр класса <see cref="FileDeskContext"/> + /// </summary> + /// <param name="options">Опции</param> + public FileDeskContext(DbContextOptions options) : base(options) { } + + /// <summary> + /// Файлы + /// </summary> + public DbSet<File> Files { get; set; } + + /// <summary> + /// Скачивания файлов + /// </summary> + public DbSet<Download> Downloads { get; set; } + + /// <summary> + /// Метод при создании БД + /// </summary> + /// <param name="modelBuilder"></param> + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + var entityTypes = modelBuilder.Model.GetEntityTypes().Select(t => t.ClrType).ToList(); + + foreach (var entityType in entityTypes) + { + var method = entityType.GetMethod("OnModelCreating", System.Reflection.BindingFlags.Static | BindingFlags.NonPublic); + method?.Invoke(null, new object[] { modelBuilder }); + } + } + } +} \ No newline at end of file diff --git a/source/FileDesk.Domain/Models/AbstractEntity.cs b/source/FileDesk.Domain/Models/AbstractEntity.cs index dfb8f77..3c5f1e2 100644 --- a/source/FileDesk.Domain/Models/AbstractEntity.cs +++ b/source/FileDesk.Domain/Models/AbstractEntity.cs @@ -1,5 +1,6 @@ namespace FileDesk.Domain.Models { + using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; /// <summary> diff --git a/source/FileDesk.Domain/Models/Download.cs b/source/FileDesk.Domain/Models/Download.cs index 906f735..313fe81 100644 --- a/source/FileDesk.Domain/Models/Download.cs +++ b/source/FileDesk.Domain/Models/Download.cs @@ -1,15 +1,18 @@ namespace FileDesk.Domain.Models { using System; + using System.ComponentModel.DataAnnotations; + using System.ComponentModel.DataAnnotations.Schema; /// <summary> /// Скачивание файла /// </summary> - public class Download + public class Download : AbstractEntity { /// <summary> /// Идентификатор файла /// </summary> + [Required] public long FileId { get; set; } /// <summary> @@ -20,11 +23,13 @@ /// <summary> /// Дата и время скачивания /// </summary> + [Required] public DateTime DateTime { get; set; } /// <summary> /// IP-адрес компьютера, на который был скачан файл /// </summary> + [Required] public string IpAddress { get; set; } } } \ No newline at end of file diff --git a/source/FileDesk.Domain/Models/File.cs b/source/FileDesk.Domain/Models/File.cs index 59fa186..e6f6092 100644 --- a/source/FileDesk.Domain/Models/File.cs +++ b/source/FileDesk.Domain/Models/File.cs @@ -2,7 +2,9 @@ { using FileDesk.Domain.Enums; using System; - using System.Reflection.Metadata; + using System.Collections.Generic; + using System.ComponentModel.DataAnnotations; + using System.ComponentModel.DataAnnotations.Schema; /// <summary> /// Файл @@ -12,26 +14,44 @@ /// <summary> /// Название /// </summary> + [Required] public string Name { get; set; } /// <summary> /// Описание /// </summary> + [Required] public string Description { get; set; } /// <summary> /// Дата и время добавления /// </summary> + [Required] public DateTime UploadDateTime { get; set; } /// <summary> - /// Сам файл + /// Содержимое файла /// </summary> - public Blob Blob { get; set; } + [Required] + public byte[] Content { get; set; } /// <summary> /// Формат /// </summary> + [Required] public FileFormat Format { get; set; } + + /// <summary> + /// Список скачиваний + /// </summary> + public List<Download> Downloads { get; set; } + + /// <summary> + /// Создает новый экземпляр класса <see cref="File"/> + /// </summary> + public File() + { + Downloads = new List<Download>(); + } } } \ No newline at end of file diff --git a/source/FileDesk.Web/FileDesk.Web.csproj b/source/FileDesk.Web/FileDesk.Web.csproj index 92605c5..dd6d599 100644 --- a/source/FileDesk.Web/FileDesk.Web.csproj +++ b/source/FileDesk.Web/FileDesk.Web.csproj @@ -4,4 +4,16 @@ <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> + <ItemGroup> + <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.9"> + <PrivateAssets>all</PrivateAssets> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + </PackageReference> + <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.9" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\FileDesk.DataAccess\FileDesk.DataAccess.csproj" /> + </ItemGroup> + </Project> diff --git a/source/FileDesk.Web/Startup.cs b/source/FileDesk.Web/Startup.cs index 6399c58..31beba6 100644 --- a/source/FileDesk.Web/Startup.cs +++ b/source/FileDesk.Web/Startup.cs @@ -1,16 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - namespace FileDesk.Web { + using FileDesk.DataAccess.Repository; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Hosting; + using Microsoft.EntityFrameworkCore; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.Hosting; + public class Startup { public Startup(IConfiguration configuration) @@ -23,6 +20,7 @@ namespace FileDesk.Web // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { + services.AddDbContext<FileDeskContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddControllersWithViews(); } diff --git a/source/FileDesk.Web/appsettings.json b/source/FileDesk.Web/appsettings.json index d9d9a9b..61a7955 100644 --- a/source/FileDesk.Web/appsettings.json +++ b/source/FileDesk.Web/appsettings.json @@ -1,4 +1,7 @@ { + "ConnectionStrings": { + "DefaultConnection": "Server=ANASTASIYA\\SQLEXPRESS;Database=FileDesk;Trusted_Connection=True;" + }, "Logging": { "LogLevel": { "Default": "Information", -- GitLab