Beeing是ASP.NET新手我正在关注这个tutorial at 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; }
}
}
我错过了什么?
答案 0 :(得分:3)
我刚检查了那个教程,并且在代码中看到了一些遗漏。
数据库初始化程序中有一个私有静态方法GetCategories()
,需要添加该方法才能在当前状态下使用您的代码。
查看Initialiser类一节中的教程,并添加缺少的方法。
如果已经添加了这些方法,那么它们可能是错误的方法声明(它们必须是静态的),或者它们的名称中有拼写错误(并非罕见,特别是如果你这样做的话)用手打印出来。)
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;
}
}
答案 1 :(得分:0)
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));