Ошибка при использовании
У меня есть ошибка
Тип, используемый в операторе 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; }
}
}
EDIT: DbContext реализует IDisposable и я не могу отредактировать класс EntityContainer() с момента его создания из шаблона.
Любые идеи, что не так?
Ответы
Ответ 1
Из этого ответа:
Контекст все еще реализует IDisposable, но если вы получаете сообщение об ошибке... жалуетесь, что не реализуете IDisposable, то ваша проблема, скорее всего, ваша модель определена в отдельной сборке, которая ссылается на EF5, и вы не добавили EF5 ссылается на ваш проект.
Ответ 2
Ответ будет заключаться в том, чтобы добавить сборку EntityFramework к ссылкам
Ответ 3
Если вы хотите использовать 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();
}
}
Ответ 4
Я добавил фреймворк сущности в свои ссылки на вызывающие проекты, и он исправил мою проблему.
Ответ 5
Вы можете попытаться использовать шаблон "Единица работы", что-то вроде этого.
public interface IUnitOfWork : IDisposable {
void Save();
}
Затем ваш частичный ObjectContext может реализовать интерфейс IUnitOfWork
:
public partial class EntityContainer : IUnitOfWork {
public void Save() {
this.SaveChanges();
}
void IDisposable.Dispose() {
base.Dispose();
}
}
Этот метод позволяет мне использовать директиву using без ошибок. Пример использования (я использую шаблон репозитория в сочетании с этим):
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;
}
}
Надеюсь, это поможет.
Ответ 6
У нас есть страница, которая выдает эту ошибку и ошибку does not contain a definition for SaveChanges
. Объекты определены в отдельном проекте, и все необходимые ссылки, по-видимому, используются.
Я обнаружил, что переключение с Visual Studio 2012 на 2010 год достаточно при редактировании страницы. Это определенно не идеально, но работает, пока мы не переключим все на EF 5 +.
Ответ 7
Если вы следуете примеру в главе 23 "Pro С# 5.0 и .Net 4.5 Framework", используя Visual Studio 2013, просто добавьте другие библиотеки DLL в папку AutoLotDAL в качестве ссылок.