簡體   English   中英

如何從DbContext清除未插入的POCO? -實體框架代碼優先

[英]How To Clear Uninserted POCO's From DbContext? - Entity Framework Code First

我目前正在為一所大學開發一個項目,該項目為學生提供了一個帳戶,並可以使用該帳戶計算其GPA,訪問論壇和屏幕共享。 我正在使用ASP.NET MVC和ASP.NET Web Api技術。 我開發了業務層,並制作了“ Manager”類,該類有助於對項目的所有POCO進行數據庫操作。 我所有的經理類都使用相同的DbContext,它來自BaseManager類。 我的POCO類中有一些規則,可防止在creedientals錯誤的情況下插入數據庫。

當我在這些字段中輸入錯誤時,數據庫插入將按預期失敗。 但是在那之后,當我插入正確的值(將值輸入到不應為null的字段等)中時,db插入將再次失敗,並且盡管錯誤已得到糾正,但還是會顯示與之前失敗的嘗試相同的驗證錯誤。

這是我的用戶POCO類(我正在共享我正在談論的2個字段):

    [Table("UserTable")]
    public class User
    {
      [Required]
      [Index(IsUnique = true)]
      [MaxLength(30, ErrorMessage = "Username can not exceed 30 characters!")]
      public string Username { get; set; }

      [Required]
      [Index(IsUnique = true)]
      [MaxLength(50, ErrorMessage = "Email can not exceed 50 characters!")]
      [DataType(DataType.EmailAddress)]
      [RegularExpression("^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}     \\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")]
      public string Email { get; set; }
 }

當檢查對應的POCO類的DbSet時,我看到所有嘗試的對象也都保留在本地,就像數據庫中的2條記錄一樣。 這是屏幕截圖:

這是我的業務層邏輯:

  • 我創建了可以由任何POCO類實現的通用存儲庫類。
  • 我創建了UnitOfWork類,該類使用SingletonPattern(在UnitOfWorkBase類中創建UnitOfWork對象)創建DbSontext,並具有Manager和ComplexManager類使用的2種方法。
    • 1.通用GetRepository
    • 2.通用GetManager
  • 我使用管理器類來定義每個POCO的方法集,例如CRUD和POCO指定的方法(例如UserManager具有用於登錄方法的CheckCreedientals)。 所有的數據庫操作都在這里進行。
  • 我使用復雜的管理器類來實現需要多個管理器的方法。 (類似於AccountComplexManager類中發生的createAccount方法,將創建兩個POCO類並將它們添加到數據庫中。) 除了提交此處所做的更改外,沒有數據庫操作。 相應的管理器類的方法被調用,並且通過這些管理器類的方法的方法完成數據庫操作。
    • 1.學生POCO
    • 2.用戶POCO
  • 我為經理創建了3個基類,以減少偽代碼。
    • 1.MotherBaseManager類:在此處創建並由進行數據庫操作的所有管理人員使用的UnitOfWork對象。 該類也由接下來的2個類繼承。 它只有Context方法可返回UnitOfWork對象。
    • 2.BaseComplexManager類:ComplexManagers類的基類。 具有GetManager方法以獲取相應的管理器來實現一些數據庫任務,並具有Save方法以將更改提交到數據庫。
    • 3.BaseManager類:Manager類的基類。 它具有Get Repository類,以便獲取用於執行數據庫操作(例如CRUD)的相應存儲庫類。

我調整后的業務層版本的類視圖是:

我想從嘗試插入的對象中清除dbSet local而不重新啟動應用程序,以使用戶有機會糾正他們的錯誤並再次創建帳戶。

如果我在某個時候拼錯或弄錯了,請原諒我。 任何幫助將不勝感激。 謝謝!

除了Sellotape關於DbContext生命周期的非常有效的評論之外,您還可以做其他幾件事。

如果您想對應用程序進行最少的更改,那么我建議您使用事務,例如

using (var transaction = dbContext.Database.BeginTransaction())
{
    try
    {
        // Prepare POCOs to be stored
        ...
        dbContext.SaveChanges();
        transaction.Commit();
    }
    catch (Exception)
    {
        // Handle failure
    }
}

如果SaveChanges()失敗,您的事務將自動回滾,並且從dbContext刪除此塊中添加的所有對象。

您可以在MSDN中找到有關EF CoreEF 6中事務的更多信息。

但是,我建議您重新考慮您的驗證方案。 數據驗證不應該在數據庫級別上進行-驗證應該在請求生命周期的更早時間進行,甚至可能在創建要存儲到數據庫的POCO之前進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM