类的类型不会转换为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指令或程序集引用)
你需要使用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();
}
我已经检查的NuGet包管理器,它肯定是装在这个项目中,我相信我这样做,反正只是某些我仔细检查了。 我也跟着你送我到我在现在的点教程,我看不到任何有关除了我创建using语句的产品p外侧,并且我没有”的事实,事实的代码不同把它写在大括号内。 – Aelux
移动p的使用语句中创建仍然给我相同的两个错误,并添加一个构造函数来StoreDB给了我以下错误: '的类型不能用作泛型类型或方法的类型参数“TContext” 'Database.SetInitializer
按照教程,然后比较两个项目。 –
你确定你没有命名位于不同的命名空间'StoreDB'多个类? – Igor
http://idownvotedbecau.se/imageofanexception/ –
@Igor我不认为我这样做,因为这是我在此解决方案下创建的唯一项目,您可以看到的类包括除另一个类之外的所有代码,以及你可以看到他们都遵循相同的命名空间。 – Aelux