Asp.net 如何编写自定义dbcontext

Asp.net 如何编写自定义dbcontext,asp.net,asp.net-mvc-3,asp.net-mvc-4,dbcontext,Asp.net,Asp.net Mvc 3,Asp.net Mvc 4,Dbcontext,我正在尝试使用visual studio 2012学习MVC 3/4。我已经创建了一个视图、模型和控制器。VS为我创建了所有的数据库。它为我添加了一个gridview,我可以在其中添加新行、编辑或删除。我想更改它从数据库中选择行的方式。我知道我必须为此更改DbContext 这是我的背景 public class ApartmentContext : DbContext { public ApartmentContext() : base("name=ApartmentContext"

我正在尝试使用visual studio 2012学习MVC 3/4。我已经创建了一个视图、模型和控制器。VS为我创建了所有的数据库。它为我添加了一个gridview,我可以在其中添加新行、编辑或删除。我想更改它从数据库中选择行的方式。我知道我必须为此更改DbContext

这是我的背景

public class ApartmentContext : DbContext
{

    public ApartmentContext() : base("name=ApartmentContext")
    {
    }

    // this part has to be changed****
    public DbSet<Apartment> Apartments { get; set; } 
}
公共类ApartmentContext:DbContext { public ApartmentContext():base(“name=ApartmentContext”) { } //这部分必须修改**** 公共DbSet公寓{get;set;} } public DbSet planties{…}返回我猜是的列表,但我想更改它选择行的方式。例如我想选择“flag”列设置为1的行。我该怎么做


谢谢

您需要创建查询。对象
表示数据库中的表,而不是列表。

您应该在相关控制器中筛选结果,而不是在DbContext中。在该控制器中可能是这样的:

...
ApartmentContext db = new ApartmentContext();
var apartments = db.Apartments.Where(a => a.Flag == 1);
...

然后使用
单元
对象呈现视图

您还可以使用实体框架dbconext执行TSQL语句或存储过程。下面是一个链接


另一种选择是在上下文周围有一个包装界面来隐藏这些细节,以便透明地应用于每个查询:

// Wrapping interface
public interface IApartmentRepository
{
    IQueryable<Apartment> Apartments { get; }
}

// As before
public class ApartmentContext : DbContext
{
  ...
}

// Implementing class, hiding the DbContext object
public class EFApartmentRepository : IApartmentRepository
{
   private ApartmentContext context = new ApartmentContext();

   public IQueryable<Apartment> Apartments
   {
       get { return this.context.Apartments.Where(a => a.Flag == 1); }
   }
}

// Your controller uses DI to get the controller
public class HomeController : Controller
{
   private IApartmentRepository apartmentContext;

   public HomeController( IApartmentRepository rep )
   {
      this.apartmentContext = rep;
   }
}
//包装接口
公共接口IApartmentRepository
{
IQueryable公寓{get;}
}
//一如既往
公共类ApartmentContext:DbContext
{
...
}
//实现类,隐藏DbContext对象
公共类EFApartmentRepository:IApartmentRepository
{
private ApartmentContext=新建ApartmentContext();
公共伊克丽公寓
{
获取{返回this.context.partments.Where(a=>a.Flag==1);}
}
}
//您的控制器使用DI获取控制器
公共类HomeController:控制器
{
私有IApartmentRepository apartmentContext;
公共家庭控制器(iPartmentRepository)
{
this.apartmentContext=rep;
}
}

控制器
IApartmentRepository
参数可以通过跳过
DefaultControllerFactory
类连接到
EFApartmentRepository
。您可以使用NInject或StructureMap等DI框架在运行时将正确的实现插入构造函数。

您应该在using语句中创建数据库上下文,或者手动处理它。没有这个,你可能会有内存泄漏