类的类型不会转换为IDisposable,并且.SaveChanges方法不存在

问题描述:

因此,我作为课程的一部分接受了练习,它创建了一个没有数据库或模型的ASP.NET MVC应用程序并使用该代码生成一个。在一节中,我给出了一些你将在下面看到的代码。 我已经尝试将| IDisposable添加到类,但仍然抛出上述错误。类的类型不会转换为IDisposable,并且.SaveChanges方法不存在

至于.SaveChanges不工作我听说这是因为实体框架无法找到,但我已经尝试将System.Data.Entity添加到using语句以及在项目选项中添加引用。

这是问题的代码:

public class HomeController : Controller 
    { 
    public ActionResult Index() 
    { 
     Models.Product p = new Models.Product(); 
     p.Product_Code = "SOFT549"; 
     p.Product_Name = "Book"; 

     using (var db = new Models.StoreDB()) 
     { 
      db.products.Add(p); 
      db.SaveChanges(); 
      ViewBag.Message = "The number of products so far is " + db.products.Count().ToString(); 
     } 

     return View(); 
    } 
    } 

这是产品类:

public class Product 
{ 
    public int ProductId { get; set; } 
    public string Product_Code { get; set; } 
    public string Product_Name { get; set; } 
    public float Price { get; set; } 
    public int Stock { get; set; } 

    public Product() 
    { 

    } 

} 

这是StoreDB类,它从一个空白的DbContext我以为我会被告知继承以后再添加一些东西,但在工作表上,我得到它要求我运行代码,这意味着它应该在此状态下编译。

public class StoreDB: DbContext 
    { 
    public DbSet<Product> products { get; set; } 
    public DbSet<Order> orders { get; set; } 
    public DbSet<Order_Line> order_lines { get; set; } 

    } 

以防万一您需要的顺序类以及:

using System.ComponentModel.DataAnnotations; 
    using System.ComponentModel.DataAnnotations.Schema; 

    public class Order 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Order_Number { get; set; } 
    public DateTime Order_Date { get; set; } 
    public virtual ICollection <Order_Line> Order_Lines { get; set; } 

    public Order() 
    { 

    } 

} 

而且这里又是以防万一详细的错误。

“StoreDB”:在使用语句中使用必须是隐式转换为“System.Double”

“StoreDB”不包含关于“的SaveChanges”的定义和没有扩展方法类型“的SaveChanges”接受类型“StoreDB”的第一个参数可以找到(是否缺少using指令或程序集引用)

+3

你确定你没有命名位于不同的命名空间'StoreDB'多个类? – Igor

+1

http://idownvotedbecau.se/imageofanexception/ –

+0

@Igor我不认为我这样做,因为这是我在此解决方案下创建的唯一项目,您可以看到的类包括除另一个类之外的所有代码,以及你可以看到他们都遵循相同的命名空间。 – Aelux

你需要使用NuGet包管理器中的引用添加到Entity Framework

当您第一次运行该解决方案时,因为DbContext没有参数,它将在您的MsSqlExpress数据库中创建一个新的数据库。

通过这个教程的详细信息:http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx


我想我已经发现了两个问题,第一个是,你没有在你的StoreDB构造函数。

public class StoreDB : DbContext 
{ 
     public StoreDB() : base() //Add a parameter to Base to specify an existing dB 
     { 
      Database.SetInitializer<StoreDB>(new DropCreateDatabaseIfModelChanges<StoreDB>()); 

     } 

     public DbSet<Product> products { get; set; } 
     public DbSet<Order> orders { get; set; } 
     public DbSet<Order_Line> order_lines { get; set; } 
} 

的第二个问题是using (var db = new Models.StoreDB())没有实现IDisplosable。你应该像下面这样做(只使用using与StoreDB绕不Models.StoreDB()):

using (var ctx = new StoreDB()) 
{ 
    var p = new Product() { Product_Code = "SOFT549",Product_Name = "Book" }; 
    ctx.Products.Add(p); 
    ctx.SaveChanges(); 
} 
+0

我已经检查的NuGet包管理器,它肯定是装在这个项目中,我相信我这样做,反正只是某些我仔细检查了。 我也跟着你送我到我在现在的点教程,我看不到任何有关除了我创建using语句的产品p外侧,并且我没有”的事实,事实的代码不同把它写在大括号内。 – Aelux

+0

移动p的使用语句中创建仍然给我相同的两个错误,并添加一个构造函数来StoreDB给了我以下错误: '的类型不能用作泛型类型或方法的类型参数“TContext” 'Database.SetInitializer (IDatabaseInitializer )'。存在从没有隐式引用转换“System.Data.Entity.DbContext'.' '的类型不能被用作类型参数‘在通用类型或方法TContext’。没有从'System.Data.Entity.DbContext'的隐式引用转换。' – Aelux

+0

按照教程,然后比较两个项目。 –