如何编写自定义dbcontext

时间:2013-05-30 07:31:28

标签: asp.net asp.net-mvc-3 asp.net-mvc-4 dbcontext

我正在尝试使用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的行。我该怎么办?

感谢

4 个答案:

答案 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框架在运行时将正确的实现插入到构造函数中。