无法从EF数据库中检索数据

本文关键字:检索 数据 数据库 EF | 更新日期: 2023-09-27 18:09:16

我有一个简单的应用程序,它应该显示列表的元素,但在调试时它返回一个空数组。我需要动态地显示这些元素。我想知道如果程序不工作,因为以下代码…

StoreController.cs

using GetMed.Models;
namespace GetMed.Controllers
{
    public class StoreController : Controller
    {
        GetMedEntities storeDB = new GetMedEntities();
        //
        // GET: /Store/
        public ActionResult Index()
        {
            var categories = storeDB.Categories.ToList();
            return View(categories);
        }
    }
}

SampleData.cs:

using System.Data.Entity;
namespace GetMed.Models
{
    public class SampleData : DropCreateDatabaseIfModelChanges<GetMedEntities>
    {
        protected override void Seed(GetMedEntities context)
        {
            var categories = new List<Category>
            {
                new Category { Name = "Infections" },
                new Category { Name = "Antibiotics" },
                new Category { Name = "Vitamins" },
                new Category { Name = "Cosmetics" }
            };
        }
    }
}

GetMedEntities.cs

namespace GetMed.Models
{
    public class GetMedEntities : DbContext
    {
        public DbSet<Category> Categories { get; set; }
    }
}

Index.cs:

@model IEnumerable<GetMed.Models.Category>
@{
    ViewBag.Title = "Index";
}
<h3>Browse Categories</h3>
<p>Select from @Model.Count() categories:</p>
<ul>
    @foreach (var category in Model)
    {
        <li>@Html.ActionLink(category.Name, "Browse", new { category = category.Name })</li>
    }
</ul>

无法从EF数据库中检索数据

如果查看数据库,您将注意到其中没有数据。看看你的Seed方法:你期望它做什么?

创建数据后,还有两个步骤要做:

  1. 将其添加到DbContext跟踪的集合
  2. 保存到数据库

结果是这些额外的行:

context.Categories.AddRange(categories);
context.SaveChanges();
    永远不要全局初始化EF context,一旦它打击到你,相信我
  1. 当通过EF向DB添加记录时,您必须调用

    using (var context = new GetMedEntities)
    {
        // YOUR ADD ROUTINE GOES HERE
        context.SaveChanges();
    }
    

改变你的类SampleData

    public class SampleData : DropCreateDatabaseIfModelChanges<GetMedEntities>
    {
        protected override void Seed(GetMedEntities context)
        {
//I STRICTLY RECOMMEND NOT TO PROVIDE CONTEXT AS A METHOD PARAMETER 
//YOU HAVE TO WRITE PROPER DB LAYER TO DO SO
            context.Categories.AddRange( new List<Category>()
            {
                new Category { Name = "Infections" },
                new Category { Name = "Antibiotics" },
                new Category { Name = "Vitamins" },
                new Category { Name = "Cosmetics" }
            });
            context.SaveChanges();
        }
    }

但简单的解决方案如下:

public class SampleData 
{
  public void SeedSampleData() 
  {
    var context = new GedMedEntities();
    context.Categories.AddRange( new List<Category>()
    {
      new Category { Name = "Infections" },
      new Category { Name = "Antibiotics" },
      new Category { Name = "Vitamins" },
      new Category { Name = "Cosmetics" }
    });
    context.SaveChanges();