当前上下文中不存在Get方法

时间:2015-12-07 12:56:52

标签: c# asp.net entity-framework

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; }
}
}

我错过了什么?

2 个答案:

答案 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));