[英]Error using Using
我有一個錯誤
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()類,因為它是從模板生成的。
有什么想法有什么不對?
從這個答案 :
上下文仍然實現IDisposable,但是如果你收到錯誤...抱怨沒有實現IDisposable,那么你的問題很可能是你的模型是在一個引用EF5的單獨程序集中定義的,而你沒有添加EF5引用你的項目。
答案是將EntityFramework程序集添加到引用中
如果要在using
語句中使用EntityContainer
,則必須實現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();
}
}
我將實體框架添加到我的調用項目的引用中,它解決了我的問題。
您可以嘗試使用工作單元模式,類似這樣。
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;
}
}
希望這會有所幫助。
我們有一個頁面拋出此錯誤, does not contain a definition for SaveChanges
錯誤does not contain a definition for SaveChanges
。 實體在單獨的項目中定義,並且似乎使用了所有必需的引用。
我發現在編輯頁面時從Visual Studio 2012切換到2010就足夠了。 它絕對不是理想的,但它可以工作,直到我們將所有內容切換到EF 5+。
如果您使用Visual Studio 2013遵循“Pro C#5.0和.Net 4.5 Framework”第23章中的示例,則只需將AutoLotDAL文件夾中的其他DLL添加為引用即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.