我有错误
using语句中使用的类型必须可以隐式转换为'System.IDisposable'
在线
using (var context = new EntityContainer())
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Globalization;
using System.Data;
using System.Data.Entity;
using school.usi.susibar.model;
namespace school.usi.susibar.test
{
class Program
{
public static void Main(string []args)
{
using (var context = new EntityContainer())
{
addOrderStatusType(context);
Console.ReadLine();
}
}
private static void addOrderStatusType(EntityContainer context)
{
try
{
OrderStatusType type = new OrderStatusType
{
Name = "Vyrizeno",
CancelPermission = false,
ChangePermission = false
};
context.OrderStatusTypes.Add(type);
context.SaveChanges();
Console.WriteLine("Pridano");
}
catch (Exception ex) {
Console.WriteLine(ex.InnerException);
}
}
}
}
EntityContainer()看起来像这样......
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace school.usi.susibar.model
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class EntityContainer : DbContext
{
public EntityContainer()
: base("name=EntityContainer")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<Role> Roles { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Table> Tables { get; set; }
public DbSet<OrderStatusType> OrderStatusTypes { get; set; }
public DbSet<Person> Persones { get; set; }
public DbSet<Item> Items { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Stock> Stocks { get; set; }
public DbSet<ItemOrderList> ItemOrderLists { get; set; }
public DbSet<ItemOrderStatus> ItemOrderStatuses { get; set; }
public DbSet<PaymentOrderStatus> PaymentOrderStatuses { get; set; }
public DbSet<Prepaid> Prepaids { get; set; }
}
}
编辑:DbContext实现了IDisposable,我无法编辑EntityContainer()类,因为它是从模板生成的。
任何想法有什么不对?
答案 0 :(得分:58)
来自this answer:
上下文仍然实现IDisposable,但是如果你收到错误...抱怨没有实现IDisposable,那么你的问题很可能是你的模型是在一个引用EF5的单独程序集中定义的,你还没有添加一个EF5对您项目的引用。
答案 1 :(得分:7)
答案是将EntityFramework程序集添加到引用
答案 2 :(得分:5)
如果您想在EntityContainer
语句中使用using
,则必须实施IDisposable
试试这个:
public partial class EntityContainer : DbContext, IDisposable
{
public EntityContainer()
: base("name=EntityContainer")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<Role> Roles { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Table> Tables { get; set; }
public DbSet<OrderStatusType> OrderStatusTypes { get; set; }
public DbSet<Person> Persones { get; set; }
public DbSet<Item> Items { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Stock> Stocks { get; set; }
public DbSet<ItemOrderList> ItemOrderLists { get; set; }
public DbSet<ItemOrderStatus> ItemOrderStatuses { get; set; }
public DbSet<PaymentOrderStatus> PaymentOrderStatuses { get; set; }
public DbSet<Prepaid> Prepaids { get; set; }
public void Dispose()
{
base.Dispose();
}
}
答案 3 :(得分:3)
我将实体框架添加到我的调用项目的引用中,它解决了我的问题。
答案 4 :(得分:1)
您可以尝试使用工作单元模式,类似这样。
public interface IUnitOfWork : IDisposable {
void Save();
}
然后您的部分ObjectContext可以实现IUnitOfWork
接口:
public partial class EntityContainer : IUnitOfWork {
public void Save() {
this.SaveChanges();
}
void IDisposable.Dispose() {
base.Dispose();
}
}
此方法允许我使用using指令而不会出错。使用示例(我将Repository模式与此结合使用):
public List<OrderModelView> GetAllOrdersAscByName() {
using (IUnitOfWork context = new EntityContainer()) {
Repository<Order> orderRepository = new Repository<Order>(context);
var orders = orderRepository.GetAll()
.Select(o => new OrderModelView {
OrderID = o.OrderID,
Name = o.Name,
OrderTypeCount = o.OrderTypes.Count
})
.OrderBy(o => o.Name)
.ToList();
return orders;
}
}
希望这有帮助。
答案 5 :(得分:0)
我们有一个页面会抛出此错误并导致does not contain a definition for SaveChanges
错误。实体在单独的项目中定义,并且似乎使用了所有必要的引用。
我发现在编辑页面时从Visual Studio 2012切换到2010就足够了。它绝对不是理想的,但它可以工作,直到我们将所有内容切换到EF 5 +。
答案 6 :(得分:0)
如果您正在遵循&#34; Pro C#5.0和.Net 4.5 Framework&#34;的第23章中的示例。使用Visual Studio 2013然后只需将AutoLotDAL文件夹中的其他DLL添加为引用。