【问题标题】:context.SaveChanges() method is not saving data in databasecontext.SaveChanges() 方法不在数据库中保存数据
【发布时间】:2022-09-25 00:30:25
【问题描述】:

我是 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 方法不起作用。我不知道我错过了什么。

任何人都帮帮我。我很沮丧。

  • 你找对地方了吗?
  • 我也试图改变实体的状态......这也行不通
  • 没有得到你先生@ErikEJ
  • \“不管用\”不是问题的描述。提供所有相关信息。您确定它不起作用的确切程度如何?你的连接字符串是什么样的?如果我不得不猜测,我会说您正在使用本地数据文件,并且要么在错误的文件中查找,要么在被新副本覆盖后查找正确的文件。这是一个常见问题,并且可能会在有关此主题的搜索中出现。
  • ` <add name=\"TmDbContext\" connectionString=\"data source=FAIRYTALE\\SQLEXPRESS;Initial Catalog=DB_TaskMaster;Integrated Security=True;\" providerName=\"System.Data.SqlClient\" />` 这是我的连接字符串的样子。我使用了代码优先的方法。初始迁移、数据库创建和使用迁移文件中的 Up() 方法播种数据已成功完成。在将任务对象添加到 DbContext 实例的 Tasks 属性后,我尝试在 OnPost() 方法中使用 Console.WriteLine,它很好地打印了所有数据,但 SaveChanges 方法没有对数据库执行任何操作。 @约翰

标签: c# entity-framework asp.net-core entity-framework-6 razor-pages


【解决方案1】:

希望这对您有所帮助,如果您按照流程进行操作,它将起作用。

从您提到的内容来看,您有 2 个项目,第一个是 Asp dotnet 核心,第二个是 ClassLibrary 来处理您的 EfCore。

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

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

(如果您使用 SQLEXPRESS,您可以更新您的服务器名称,您可以相应地更新) Connection String Screenshot

看看我在类库中创建的以下两个模型:

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 proj 中的 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 打开启动类并添加我们创建的扩展方法 AddED Services 传入配置:

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();
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2020-07-03
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多