亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 實體框架(代碼優先),在模型上實現 CRUD 操作

C# 實體框架(代碼優先),在模型上實現 CRUD 操作

C#
鳳凰求蠱 2021-08-07 15:34:28
我只是想知道您是否可以在模型(CRUD 事務)中存儲一個看起來像這樣的函數:我現有的代碼:public class tbluser{    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    public int id { get; set; }    [Required(ErrorMessage = "Username is required")]    public string username { get; set; }    [Required(ErrorMessage = "Password is required")]    public string password { get; set; }    public static List<tbluser> list()    {        using (var db = new sample())        {            var user = db.tbluser.ToList();            return user;        }    }}我想要的是:public class tbluser:DbContext{    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    public int id { get; set; }    [Required(ErrorMessage = "Username is required")]    public string username { get; set; }    [Required(ErrorMessage = "Password is required")]    public string password { get; set; }    public static List<tbluser> list()    {        return this.toList();    }}我也想問一下實現實體框架的方法是否可以。
查看完整描述

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");

}


查看完整回答
反對 回復 2021-08-07
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

有一個著名的原則叫做“關注點分離”,如果你這樣做會很生氣。我的建議是保持代碼簡單、有意義和松散耦合。


查看完整回答
反對 回復 2021-08-07
?
白衣染霜花

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 的例子,使用依賴注入的存儲庫和工作單元模式。在嘗試創建一些獨特的東西之前先掌握這些。未來的開發人員在查看您的代碼時會感謝您。:)


查看完整回答
反對 回復 2021-08-07
  • 3 回答
  • 0 關注
  • 251 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號