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

我错过了什么?

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

我刚刚查看了该教程,发现您的代码中缺少了一些内容。

数据库初始化程序中有一个私有静态方法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));