1

我正在尝试使用 Visual Studio 2012 学习 MVC 3/4。我创建了一个视图、一个模型和控制器。VS 为我创建了所有数据库的东西。它为我添加了一个网格视图,我也可以在其中添加新行、编辑或删除。我想改变它从数据库中选择行的方式。我知道我必须为此更改 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{...} 返回我猜的列表,但我想更改它选择行的方式。例如; 我想选择“标志”列设置为 1 的行。我该怎么做?

谢谢

4

4 回答 4

2

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

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

然后使用apartment对象来渲染您的视图

于 2013-05-30T07:45:48.147 回答
1

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

于 2013-05-30T07:41:36.150 回答
0

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

http://www.dotnetjalps.com/2012/04/execute-tsql-statement-with.html

于 2013-05-30T08:24:02.280 回答
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参数连接到。您可以使用 NInject 或 StructureMap 之类的 DI 框架在运行时将正确的实现插入到构造函数中。EFApartmentRepositoryDefaultControllerFactory

于 2013-05-30T13:04:41.040 回答