context.SaveChanges() 方法未将数据保存到数据库中

问题描述 投票:0回答:2

我是 Dotnet 和 EF 的新手。我正在努力学习EF。因此,我使用 ASP.NET CORE Web 应用程序创建了一个待办事项应用程序。基本上它是一个 Razor 页面应用程序。我创建了另一个类库项目来使用 EF。我添加了对第一个项目的引用。它是 ASP.NET CORE 与 EF 的组合。 这是 DbContext 文件。

namespace TaskMaster_DataLayer.Models
{
    public class TmDbContext : DbContext
    {
        public TmDbContext() : base()
        {

        }
        public DbSet<Status> Statuses { get; set; }
        public DbSet<Task> Tasks { get; set; }
        
    }
}

这是index.cshtml.cs 文件。

namespace TaskMaster.Pages
{
    [BindProperties]
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;
        private readonly TmDbContext taskMasterContext;
        
        public List<Status> stsList;

        public Task? task = null;
        public string? TaskValue { get; set; }
        public DateTime? DueDate { get; set; }
        public string? StatusName { get; set; }
        public Status status { get; set; }


        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
            taskMasterContext = new TmDbContext();
            stsList = taskMasterContext.Statuses.ToList();
        }

        public void OnGet()
        {
        }

        public void OnPost()
        {
            TaskValue = Request.Form["Task"];
            if(TaskValue != null && TaskValue != String.Empty)
            {
                foreach(var sts in stsList)
                {
                    var name = sts.GetName();
                    if(name == StatusName)
                    {
                        status = sts;
                        break;
                    }
                }
                task = new Task()
                {
                    Name = TaskValue,
                    DueDate = DueDate,
                    StatusId = status.Id,
                    status = status,
                };
                taskMasterContext.Tasks.Add(task);
                taskMasterContext.SaveChanges();
            }
        }
    }
}

提交表单时,OnPost 方法正在执行。我没有收到任何错误,但数据没有保存或插入到数据库中。该任务已添加到 DbSet,但 SaveChanges 方法不起作用。我不知道我错过了什么。

任何人都可以帮助我。我很沮丧。

c# entity-framework asp.net-core entity-framework-6 razor-pages
2个回答
1
投票

希望这对您有帮助,如果您遵循此流程,这将会起作用。

根据您所提到的,您有 2 个项目,第一个是 Asp dotnet core,第二个是 ClassLibrary 来处理您的 EfCore。

现在首先转到您的 Asp 项目并打开 appsettings.json 文件并添加连接字符串,如下所示:

"ConnectionStrings": {
"defaultCon": "Server= 
(localdb)\\MSSQLLocalDB;Database=TodoDB;Trusted_Connection=True;"
}

(如果您使用SQLEXPRESS,您可以更新您的服务器名称,您可以相应更新) 连接字符串截图

看看我在类库中创建的模型,如下所示两个:

public class Task
{
  [Key]
  public int Id { get; set; }
  public string TaskName { get; set; }
  public Status Status { get; set; }
}

public class Status
{
   public int Id { get; set; }
   public int TaskId { get; set; }
   public bool status { get; set; }
}

你的 DbContext 应该是这样的:

public class AppDbContext : DbContext
{
  public AppDbContext(DbContextOptions<AppDbContext> options): base(options)
  {

  }

  public DbSet<Status> Statuses { get; set; }
  public DbSet<Task> Tasks { get; set; }

}

现在我们必须在 ClassLibrary 项目中的 Create 类的依赖注入中注册 AppDbContext,如下所示。

public static class ServiceRegistration
{
        public static IServiceCollection AddEFServices(this IServiceCollection services, IConfiguration configuration)
        {
            services.AddDbContext<AppDbContext>(options =>
                options.UseSqlServer(configuration.GetConnectionString("defaultCon")));
            return services;
        }
}

在Asp proj中打开启动类并添加我们创建的扩展方法AddEFServices并传入配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddEFServices(Configuration);
}

对于这个例子,我使用了 Dotnet Core 5, 在类库中安装以下 Nuget 包:

<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.17" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.17">
and for Asp proj Install below Nuget Package:
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.17">

现在打开“包管理器控制台”,您可以在(工具/Nuget包管理器/包管理器控制台)下找到 将您的 Asp 项目保留为启动 Proj 并在包管理器控制台窗口中默认项目应该是您的 ClassLibrary

输入以下命令: 添加迁移初始设置 (如果没有收到任何错误,接下来将创建迁移类,如下所示) 更新数据库 (您的数据库和表将被创建)

现在转到您的 Asp Razor 页面 (IndexModel) 现在,在构造函数中,您可以访问 AppDbContext,如下所示:

private readonly ILogger<IndexModel> _logger;
    private readonly AppDbContext _dbContext;

public IndexModel(ILogger<IndexModel> logger, AppDbContext dbContext)
{
    _logger = logger;
    _dbContext = dbContext;
} 

//For Sample i have hardcoded the data in your case you can receive the data from HTML Form.        
public void OnGet()
{
      var NewTast = new ClassLibrary.Model.Task();
      NewTast.TaskName = "Test Task";
      var Status = new Status();
      Status.status = true;
      NewTast.Status = Status;

      _dbContext.Tasks.Add(NewTast);
      _dbContext.SaveChanges();
}

现在,当您检查数据库时,您可以看到表状态和表任务中将插入数据。


0
投票

在代码中准确地 at_context.SaveChanges(); 处打断,并查看是否出现截断之类的错误

© www.soinside.com 2019 - 2024. All rights reserved.