【问题标题】:简单的 .NET Entity Framework 应用程序在执行时只打开一个 ASP.NET 网页
【发布时间】:2022-01-23 17:00:00
【问题描述】:

我正在学习关于实体框架的教程,希望能够将我在工作中的数据库/ETL/SQL 技能和我在 Unity 中的 C# 开发技能结合起来。

因此,这是我在统一 C# 世界之外的第一个 .NET 框架项目。

设置:我在我的计算机上创建了一个本地数据库,我已通过 SQL ManagementStudio 成功连接到该数据库。我有两个模型类,一个 Author 和一个 Book。我有从 DbContext 扩展的 LibraryContext 类,以及从 Controller 扩展的 HomeController。 Startup.cs 中的 ConfigureServices() 方法中添加了额外的一行,除了 Startup.cs 类未更改。见下文。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<LibraryContext>(option => option.UseSqlServer(Configuration.GetConnectionString("LibraryDemo1")));  //this is the additional code
            services.AddRazorPages();
        }

预期行为:在执行时,目的是将两个模型类(Author 和 Book)创建为本地 Db 中的表。这不会发生。

实际行为:没有创建表格,并弹出一个网页(见下图)

它看起来不像我的代码正在执行,因为当我将数据库连接字符串更改为一些废话时,它甚至不会引发错误。所以就好像它甚至没有尝试访问数据库一样。

我觉得这里有一些我不理解的更大的事情,可能是关于项目设置或配置。例如,我什至不知道如何调用下面的 Index() 方法,并且在我的教程中没有看到对它的调用的地方。请参阅下面的相关代码。我不会发布 Author 和 Book 类,因为它们非常简单。

任何帮助将不胜感激。谢谢!



//lots of Usings above here, not posting for the sake of space
namespace CodeFirstEntityFramework.Data
{
    public class LibraryContext : DbContext
    {
        public LibraryContext(DbContextOptions<LibraryContext> options)
            : base(options)  //this calls the base constructor from the DbContext class
        {
            
        }
        //the DbSet represents an entire table
        public DbSet<Author> Author { get; set; }
        public DbSet<Book> Book { get; set; }
    }
}
namespace CodeFirstEntityFramework.Controllers
{
    public class HomeController : Controller
    {
        private LibraryContext _context;

        public HomeController(LibraryContext context)
        {
            _context = context;
        }

        public string Index()
        {
            _context.Database.EnsureCreated();
            return "DB has been created";
        }
    }
}

【问题讨论】:

  • 在某个地方有 Migration 的代码,它在数据库中创建表,是吗?
  • 不。正如我刚刚在下面评论的那样,我所关注的类有点旧,并且使用 EntityFramework 2.0。这可能是差异所在吗?我目前正在使用 代码优先 方法,这是值得的。

标签: c# .net sql-server database entity-framework


【解决方案1】:

从您的图像看来,您创建了一个带有剃须刀页面而不是 MVC 项目的 ASP.NET Web 应用程序。

要执行 EnsureCreated,您需要将其放在 OnGet() 方法内的 Index.html.cs file 中。

public class IndexModel : PageModel
{
    private readonly ILogger<IndexModel> _logger;
    private LibraryContext _context;

    public IndexModel(ILogger<IndexModel> logger,LibraryContext context)
    {
        _logger = logger;
        _context = context;
    }

    public void OnGet()
    {
        _context.Database.EnsureCreated();
    }
}

如果出现更多错误,那么也可能是配置问题,所以我会要求查看 Startup.cs

【讨论】:

  • hmmm...我使用的类基于 EntityFramework 2.0(该类有点旧)。这可能是为什么?因为它显然对他有用,而且 EnsureCreated() 方法绝对不在 Index.html.cs 文件中。
  • 这只是您创建的项目类型。尝试创建一个新项目,但在模板中选择“ASP.NET Core Web App (Model-View-Controller)”并重做您所做的步骤。
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
相关资源
最近更新 更多