16

エラーが発生しました

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() クラスを編集できません。

何が間違っているのですか?

4

7 に答える 7

59

From this answer:

The context still implements IDisposable, but if you're getting an error... complaining about not implementing IDisposable, then your problem is most likely that your model is defined in a separate assembly that references EF5 and you have not added an EF5 reference to your project.

于 2012-11-25T18:50:21.977 に答える
7

答えは、EntityFramework アセンブリを参照に追加することです。

于 2013-06-21T12:24:05.997 に答える
5

ステートメントで使用する場合EntityContainerは、IDisposableを実装する必要がありますusing

これを試して:

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();
    }
}
于 2012-11-25T18:18:14.163 に答える
4

呼び出し元プロジェクトの参照にエンティティ フレームワークを追加すると、問題が修正されました。

于 2015-02-18T16:16:05.977 に答える
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ディレクティブをエラーなしで使用できます。使用例(これと組み合わせてリポジトリパターンを使用します):

    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;
        }
    }

うまくいけば、これがお役に立てば幸いです。

于 2013-02-27T22:29:16.407 に答える
0

このエラーとエラーをスローするページがありdoes not contain a definition for SaveChangesます。エンティティは別のプロジェクトで定義され、必要なすべての参照が使用されているように見えます。

ページを編集するときは、Visual Studio 2012 から 2010 に切り替えるだけで十分であることがわかりました。これは間違いなく理想的ではありませんが、すべてを EF 5+ に切り替えるまでは機能します。

于 2014-03-18T19:42:36.537 に答える