我正在尝试使用visual studio 2012学习MVC 3/4。我创建了一个视图,一个模型和一个控制器。 VS为我创建了所有数据库的东西。它为我添加了一个gridview,我可以在其中添加新行,编辑或删除。我想改变它从数据库中选择行的方式。我知道我必须为此更改DbContext。
这是我的DbContext,
public class ApartmentContext : DbContext
{
public ApartmentContext() : base("name=ApartmentContext")
{
}
// this part has to be changed****
public DbSet<Apartment> Apartments { get; set; }
}
public DbSet Apartments {...}返回我猜的列表,但我想改变它选择行的方式。例如;我想选择“flag”列设置为1的行。我该怎么办?
感谢
答案 0 :(得分:2)
您应该在相关控制器中过滤结果,而不是在DbContext中过滤。在那个控制器中可能是这样的:
...
ApartmentContext db = new ApartmentContext();
var apartments = db.Apartments.Where(a => a.Flag == 1);
...
然后使用apartment
对象呈现您的视图
答案 1 :(得分:1)
您需要创建查询。对象Apartments
表示数据库中的表,而不是列表。
答案 2 :(得分:0)
您还可以使用实体框架dbcontext来执行SQL语句或存储过程。以下是该链接。
http://www.dotnetjalps.com/2012/04/execute-tsql-statement-with.html
答案 3 :(得分:0)
另一种方法是在上下文周围设置一个包装接口来隐藏这些细节,这样就可以透明地应用于每个查询:
// 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
参数可以通过覆盖EFApartmentRepository
类连接到DefaultControllerFactory
。您可以使用像NInject或StructureMap这样的DI框架在运行时将正确的实现插入到构造函数中。