ASP.NET 5 MVC 6通用存儲庫模式

asp.net-core asp.net-core-mvc c# entity-framework-core

一直在尋找教程或其他什麼的地方。

我一直在嘗試將MVC5的舊通用存儲庫模式實現到一個新的MVC6項目中。

我設置了3個類庫.Core.Data.Service ,但是IDBset存在問題,似乎我的intellisense不喜歡它,我試圖添加System.Data和Entity框架6但沒有任何運氣(無法找到它) ...混亂)。

漫遊google之後我決定在這裡問一下,有沒有正確方法的教程,還是有人會拋出一個非常簡單的MVC6 Generic Repository模式?我有一種感覺,Old的做法可能已經改變,似乎無法找到除內置DI之外的任何信息。

代碼:我的IDbContext接口

IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity;

沒有看到IDbSet ,這僅僅是因為Entity Framework?我確實有它的參考。

問題可能是我無法找到實體框架的使用陳述。

更新:

使用Entity framework 8.0.0 beta。將所有IDbset引用更改為DbSet。

但是在我的通用存儲庫中,我使用的方法如下:

IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity;

“查找”不是一種方法。我不能再在我的捕獲中使用“DbEntityValidationException”。

一般承認的答案

實體框架7 Beta 8未附帶查找方法。它可能會在最終版本之前添加。

您必須使用FirstOrDefault方法,直到發生這種情況

public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

由於無法識別Id屬性,因此您必須添加一個接口並使您的存儲庫實現它。

public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

例如

public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

來自github問題列表 。 EF7不執行自動數據驗證,因此EF7中不存在DbEntityValidationException。

請注意:EF7不是EF的更新,而是重寫。


熱門答案

與firste的回答相反,我對使用FirstOrDefault沒有信心,因為它會產生一個SELECT TOP 1 [...]。

在許多情況下,Id應該是唯一的,但有時你可能會設計糟糕的Db。如果沒有,您的應用程序應拋出一個異常(這就是我們正在尋找的)。

因此,在EF7實現Find()方法之前,我強烈建議使用SingleOrDefault()

public virtual T GetById(int id)
{
    return this.Entities.SingleOrDefault(x => x.Id == id);
}

像這樣,你添加一個應用程序控件來驗證Id應該是唯一的,如果Db正確完成則不用擔心。它為您的業務增加了另一層安全性。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因