Get方法在当前上下文中不存在
本文关键字:上下文 不存在 方法 Get | 更新日期: 2023-09-27 18:26:01
作为ASP.NET的新手,我在www.ASP.NET上学习本教程。但在编写public class ProductDatabaseInitializer
时遇到了问题
我按照编写了ProductContext.cs类
using System.Data.Entity;
namespace WingtipToys.Models
{
public class ProductContext : DbContext
{
public ProductContext() : base("WingtipToys")
{
}
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
}
但是在写入ProductDatabaseInitializer.cs:时出错
using System.Collections.Generic;
using System.Data.Entity;
namespace WingtipToys.Models
{
public class ProductDatabaseInitializer : DropCreateDatabaseIfModelChanges<ProductContext>
{
protected override void Seed(ProductContext context)
{
GetCategories().ForEach(c => context.Categories.Add(c));// <-here
GetProducts().ForEach(p => context.Products.Add(p)); // <-here
}
}
}
在GetCategories()
和GetProducts()
上,我得到错误"当前上下文中不存在"。
类别类别:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace WingtipToys.Models
{
public class Category
{
[ScaffoldColumn(false)]
public int CategoryID { get; set; }
[Required, StringLength(100), Display(Name ="Name")]
public string CategoryName { get; set; }
[Display(Name ="Product Description")]
public string Description { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
}
产品类别:
using System.ComponentModel.DataAnnotations;
namespace WingtipToys.Models
{
public class Product
{
[ScaffoldColumn(false)]
public int ProductID { get; set; }
[Required, StringLength(100), Display(Name ="Name")]
public string ProductName { get; set; }
[Required, StringLength(10000), Display(Name ="Product Description"), DataType(DataType.MultilineText)]
public string Description { get; set; }
public string ImagePath { get; set; }
[Display(Name = "Price")]
public double? UnitPrice { get; set; }
public int? CategoryID { get; set; }
public virtual Category Category { get; set; }
}
}
我错过了什么?
我刚刚查看了该教程,发现您的代码中缺少了一些内容。
数据库初始化程序中有一个私有静态方法GetCategories()
,需要添加它才能在当前状态下使用代码。
查看Initializer类部分中的教程,并添加缺少的方法。
如果已经添加了这些方法,那么它们可能有错误的方法声明(它们必须是静态的),或者名称中有拼写错误(这并不罕见,尤其是当您手动键入它们时)。
private static List<Category> GetCategories() {
var categories = new List<Category> {
new Category
{
CategoryID = 1,
CategoryName = "Cars"
},
// The rest of the categories here...
};
return categories;
}
请注意,您可以使用类型来初始化此字段(比使用方法更接近的方式)。
这花了我一些时间来适应Java背景,在那里我们必须编写get/set方法。
编辑-
private static List<Category> _categories;
public static List<Category> Categories {
get {
_categories = new List<Category> {
new Category
{
CategoryID = 1,
CategoryName = "Cars"
}
};
return _categories;
}
}
public class ProductContext : DbContext
{
public ProductContext() : base("WingtipToys")
{
}
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
protected override void Seed(ProductContext context)
{
GetCategories().ForEach(c => context.Categories.Add(c));// <-here
GetProducts().ForEach(p => context.Products.Add(p)); // <-here
}
在这里您不需要调用GetCategories().ForEach(c => context.Categories.Add(c));
,因为GetCategories()是一个方法,并且您没有定义任何该名称的方法,在这里您可以直接在DbSet对象上调用foreach,如Categories.ForEach(c => context.Categories.Add(c));