无法从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>
如果查看数据库,您将注意到其中没有数据。看看你的Seed
方法:你期望它做什么?
创建数据后,还有两个步骤要做:
- 将其添加到
DbContext
跟踪的集合 - 保存到数据库
结果是这些额外的行:
context.Categories.AddRange(categories);
context.SaveChanges();
- 永远不要全局初始化EF context,一旦它打击到你,相信我
当通过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();