我是 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 方法不起作用。我不知道我错过了什么。
任何人都可以帮助我。我很沮丧。
希望这对您有帮助,如果您遵循此流程,这将会起作用。
根据您所提到的,您有 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();
}
现在,当您检查数据库时,您可以看到表状态和表任务中将插入数据。
在代码中准确地 at_context.SaveChanges(); 处打断,并查看是否出现截断之类的错误