Ошибка при использовании - программирование
Подтвердить что ты не робот

Ошибка при использовании

У меня есть ошибка

Тип, используемый в операторе 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() с момента его создания из шаблона.

Любые идеи, что не так?

4b9b3361

Ответ 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 в качестве ссылок.