Asp.net 如何编写自定义dbcontext
我正在尝试使用visual studio 2012学习MVC 3/4。我已经创建了一个视图、模型和控制器。VS为我创建了所有的数据库。它为我添加了一个gridview,我可以在其中添加新行、编辑或删除。我想更改它从数据库中选择行的方式。我知道我必须为此更改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"
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语句中创建数据库上下文,或者手动处理它。没有这个,你可能会有内存泄漏