2013-05-30 41 views
1

我想學習使用visual studio 2012的MVC 3/4。我創建了一個視圖,模型和控制器。 VS爲我創建了所有的數據庫資料。它爲我添加了一個gridview,我可以添加一個新行,也可以編輯或刪除。我想改變它從數據庫中選擇行的方式。我知道我必須爲此更改DbContext。如何編寫自定義dbcontext

,這裏是我的DbContext,

public class ApartmentContext : DbContext 
{ 

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

    // this part has to be changed**** 
    public DbSet<Apartment> Apartments { get; set; } 
} 

公共DbSet公寓{...}返回我猜的名單,但我想改變它選擇行的方式。例如;我想選擇其「標誌」列設置爲1的行。我該怎麼做?

謝謝

回答

2

您應該在相關控制器中篩選結果,而不是在DbContext中進行篩選。這可能是這樣在控制器:

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

,然後用apartment對象來渲染視圖

+2

你應該在using語句中創建數據庫上下文或手動處理它。沒有這個,你可能會有內存泄漏 –

+0

偉大的提示!坦 – AminSaghi

1

您需要創建查詢。對象Apartments代表數據庫中的表格,而不是列表。

+0

請問你給我的出發點:) –

+0

http://vatsal-desai.blogspot.com/2011/04/linq-to-entity-framework-tutorial.html –

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框架在運行時將正確的實現插入到構造函數中。