3 回答

TA貢獻1998條經驗 獲得超6個贊
下面是一個快速示例,說明如何設置簡單的 Code First 實現以開始使用。
首先,定義您的用戶模型。整數類型的 Key 屬性會自動為您配置身份屬性。然后,如果您計劃按用戶名進行頻繁查找(以獲取用戶詳細信息或驗證密碼),則可能需要用戶名索引。
public class User
{
[Key] // Becomes identity by default
public int Id { get; set; }
[Index("IX_User_Username", IsUnique = true)]
public string Username { get; set; }
public string Password { get; set; }
}
然后,您可以定義
public class AppDataContext : DbContext
{
public AppDataContext() : base("name=DBConnection") { }
public DbSet<User> Users { get; set; }
}
您只需要確保您的配置文件中有一個連接字符串來匹配那里傳遞的名稱。
<connectionStrings>
<add name="DBConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=instancePath;Initial Catalog=dbName;Integrated Security=true;MultipleActiveResultSets=True" />
</connectionStrings>
這現在將允許您創建這樣的存儲庫:
public class UserRepo : IDisposable
{
public Lazy<AppDataContext> _db = new Lazy<AppDataContext>(() => new AppDataContext());
public IQueryable<User> Get() => _db.Value.Users.AsQueryable();
public IList<User> GetAll() => _db.Value.Users.ToList();
public void Dispose()
{
if (_db.IsValueCreated)
_db.Value.Dispose();
}
}
因此,您可以直接使用 repo 或上下文。
// Use the repo
using (var userRepo = new UserRepo())
{
var allUsers = userRepo.GetAll();
var user = userRepo.Get().FirstOrDefault(m => m.Username == "myUsername");
}
// Or just use the data context
using (var db = new AppDataContext())
{
var allUsers = db.Users.ToList(); // Get all users
var user = db.Users.FirstOrDefault(m => m.Username == "myUsername");
}

TA貢獻1796條經驗 獲得超10個贊
像這樣的代碼將會有很大的問題。
在第一個示例中,您將 DbContext 的實例與實體緊密耦合。調用 tblUser.list() 將返回一個用戶實體列表,但這些實體現在不在 DbContext 的范圍內。(由于using()塊關閉)這意味著檢索相關實體的任何延遲加載調用都將失敗,并且在將它們重新附加到另一個 DbContext 之前,您無法保留對實體的任何更改。這變得非?;靵y,非???。
在第二個示例中,您將擴展 DbContext,這意味著每個“實體”都有效地限定了 DbContext 使用范圍以填充其自身的實例。您不能只是“靜態”包裝方法,因為這對從 DbContext 繼承的非靜態 DbSet 沒有可見性。
這在性能方面會很糟糕,從代碼的角度來看,這看起來很奇怪:
IE
using (var user = new tbluser)
{
var users = user.list(); // not static.
// .. Do stuff..
}
使它成為靜態將是有問題的,因為 DbContext 需要在 tbluser 中是靜態范圍的
public class tbluser
{
private static MyContext _context = new MyContext();
// ...
public static List<tbluser> list()
{
return _context.tblusers.ToList();
}
}
這可能仍然存在問題,例如靜態實例在遠程運行之前如何處理,但我當然不能推薦這樣的方法。
相反,按預期使用 DbContext??纯聪?Unity 或 Autofac 這樣的 IoC 容器來管理 DbContext 的生命周期范圍,并將實例作為依賴項注入需要它的類,或者至少將它包裝在一個using() {}塊中,并將其視為具有 DbSet 的存儲庫。
有很多有效使用 DbContext 的例子,使用依賴注入的存儲庫和工作單元模式。在嘗試創建一些獨特的東西之前先掌握這些。未來的開發人員在查看您的代碼時會感謝您。:)
- 3 回答
- 0 關注
- 251 瀏覽
添加回答
舉報