Данные не отправляются в базу данных
Всем привет. Пишу простенький проект - онлайн-магазин - с использованием Blazor Server App. Во время добавления новых товаров, пытаюсь сохранить эти добавленные товары. Нажимается на кнопку Сохранить, ровным счетом ничего не происходит - не записываются данные в базу данных. Вот код:
@page "/addproduct"
@using Data.Models
@using System.ComponentModel.DataAnnotations
@inject Data.DbContext Db
@inject NavigationManager Nav
@using Microsoft.EntityFrameworkCore;
<h3>Добавить товар</h3>
<EditForm Model="@product" OnValidSubmit="@Save" FormName="AddProductForm">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="mb-3">
<label>Название товара:</label>
<InputText @bind-Value="product.NameProduct" class="form-control" />
</div>
<div class="mb-3">
<label>Цена:</label>
<InputNumber @bind-Value="product.Price" class="form-control" />
</div>
<div class="mb-3">
<label>Категория:</label>
<InputSelect @bind-Value="selectedCategoryId" class="form-control">
<option value="0">-- выберите категорию --</option>
@foreach (var cat in categories)
{
<option value="@cat.CategoryId">@cat.NameCategories</option>
}
</InputSelect>
</div>
<div class="mb-3">
<label>Или введите новую категорию:</label>
<InputText @bind-Value="newCategoryName" class="form-control" />
</div>
<div class="form-check mb-3">
<InputCheckbox @bind-Value="product.IsHidden" class="form-check-input" />
<label class="form-check-label">Скрыть</label>
</div>
<button type="submit" class="btn btn-success">Сохранить</button>
<button type="button" class="btn btn-secondary" @onclick="Cancel">Отмена</button>
</EditForm>
@code {
Product product = new();
List<Category> categories = new();
int selectedCategoryId = 0;
string newCategoryName = string.Empty;
protected override void OnInitialized()
{
categories = Db.Categories.ToList();
}
async Task Save()
{
// Выбор между существующей и новой категорией
if (!string.IsNullOrWhiteSpace(newCategoryName))
{
var newCategory = new Category { NameCategories = newCategoryName };
Db.Categories.Add(newCategory);
await Db.SaveChangesAsync(); // обязательно сохранить, чтобы получить CategoryId
product.CategoryId = newCategory.CategoryId;
}
else if (selectedCategoryId > 0)
{
product.CategoryId = selectedCategoryId;
}
else
{
// Ни категория, ни имя — ошибка
return;
}
Db.Products.Add(product);
await Db.SaveChangesAsync();
Nav.NavigateTo("/products");
}
void Cancel()
{
Nav.NavigateTo("/products");
}
}
Класс DbContext.cs:
using System;
using System.Collections.Generic;
using Data.Models;
using Microsoft.EntityFrameworkCore;
namespace Data;
public partial class DbContext : Microsoft.EntityFrameworkCore.DbContext
{
public DbContext()
{
}
public DbContext(DbContextOptions<DbContext> options)
: base(options)
{
}
public virtual DbSet<Category> Categories { get; set; } = null!;
public virtual DbSet<Customer> Customers { get; set; }
public virtual DbSet<Order> Orders { get; set; }
public virtual DbSet<OrderItem> OrderItems { get; set; }
public virtual DbSet<Product> Products { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Category>(entity =>
{
entity.HasKey(e => e.CategoryId).HasName("PK__Categori__19093A2BBD83C839");
entity.Property(e => e.CategoryId).HasColumnName("CategoryID");
entity.Property(e => e.NameCategories).HasMaxLength(30);
});
modelBuilder.Entity<Customer>(entity =>
{
entity.HasKey(e => e.CustomerId).HasName("PK__Customer__A4AE64B81DD23A65");
entity.Property(e => e.CustomerId).HasColumnName("CustomerID");
entity.Property(e => e.CustomerAddress).HasMaxLength(300);
entity.Property(e => e.Email).HasMaxLength(50);
entity.Property(e => e.FirstName).HasMaxLength(50);
entity.Property(e => e.Phone).HasMaxLength(20);
});
modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(e => e.OrderId).HasName("PK__Orders__C3905BAF557949B8");
entity.Property(e => e.OrderId).HasColumnName("OrderID");
entity.Property(e => e.CustomerId).HasColumnName("CustomerID");
entity.Property(e => e.DeliveryAddress).HasMaxLength(300);
entity.Property(e => e.OrderDate)
.HasDefaultValueSql("(getdate())")
.HasColumnType("datetime");
entity.HasOne(d => d.Customer).WithMany(p => p.Orders)
.HasForeignKey(d => d.CustomerId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK__Orders__Customer__47DBAE45");
});
modelBuilder.Entity<OrderItem>(entity =>
{
entity.HasKey(e => e.OrderItemId).HasName("PK__OrderIte__57ED06A124771180");
entity.Property(e => e.OrderItemId).HasColumnName("OrderItemID");
entity.Property(e => e.OrderId).HasColumnName("OrderID");
entity.Property(e => e.ProductId).HasColumnName("ProductID");
entity.HasOne(d => d.Order).WithMany(p => p.OrderItems)
.HasForeignKey(d => d.OrderId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK__OrderItem__Order__4AB81AF0");
entity.HasOne(d => d.Product).WithMany(p => p.OrderItems)
.HasForeignKey(d => d.ProductId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK__OrderItem__Produ__4BAC3F29");
});
modelBuilder.Entity<Product>(entity =>
{
entity.HasKey(e => e.ProductId).HasName("PK__Products__B40CC6EDA0EA098D");
entity.Property(e => e.ProductId).HasColumnName("ProductID");
entity.Property(e => e.CategoryId).HasColumnName("CategoryID");
entity.Property(e => e.NameProduct).HasMaxLength(50);
entity.Property(e => e.Price).HasColumnType("decimal(10, 2)");
entity.HasOne(d => d.Category).WithMany(p => p.Products)
.HasForeignKey(d => d.CategoryId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK__Products__Catego__440B1D61");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
Класс модели Categories:
using System;
using System.Collections.Generic;
namespace Data.Models;
public partial class Category
{
public int CategoryId { get; set; }
public string NameCategories { get; set; } = null!;
public virtual ICollection<Product> Products { get; set; } = new List<Product>();
}
А если написать вот такой код для проверки:
protected override void OnInitialized()
{
if (!Db.Categories.Any())
{
Db.Categories.Add(new Category { NameCategories = "Тест" });
Db.SaveChanges();
}
categories = Db.Categories.ToList();
}
То данные вставляются в базу данных. Почему?!