Как удалить незанятые POCO из DbContext? - Entity Framework Code First - PullRequest
0 голосов
/ 14 апреля 2019

В настоящее время я разрабатываю проект для университета, который предоставляет студентам возможность создать учетную запись, и с помощью этой учетной записи они могут рассчитывать свой средний балл, используя форум и общий доступ к экрану.Я использую технологии ASP.NET MVC и ASP.NET Web Api.Я разработал свой бизнес-уровень и создал классы «Менеджер», которые помогают выполнять операции с БД для всех POCO моего проекта.Все мои классы менеджера используют один и тот же DbContext, который идет из класса BaseManager.У меня есть некоторый набор правил в моих классах POCO, который предотвращает вставку БД, если creedientals не правы.

При неправильном вводе этих полей вставка БД завершается неудачно, как и ожидалось.Но после этого, когда я вставляю правильные значения (ввод значения в поле, которое не должно быть нулевым и т. Д.), Вставка БД снова завершается неудачно, и появляются те же ошибки валидации, что и до неудачной попытки, несмотря на то, что ошибки исправлены.

Вот мой класс 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; }
 }

Когда я проверяю DbSet моего соответствующего класса POCO, я вижу всеиз моих попыток объектов также хранятся локально, как и мои 2 записи в базе данных.Вот скриншот:

Вот моя логика бизнес-уровня:

  • Я создал универсальные классы репозитория, которые могут быть реализованы любыми классами POCO.
  • Я создал класс UnitOfWork, который создает DbSontext с SingletonPattern (объект UnitOfWork, создаваемый в классе UnitOfWorkBase) и имеет 2 метода, используемых классами Manager и ComplexManager.
    • 1.Generic GetRepository
    • 2.Generic GetManager
  • Я использую классы менеджера для определения каждого набора методов POCO, таких как CRUD и POCO, указанныхметоды (например, UserManager имеет CheckCreedientals для метода входа).Все операции с базами данных, сделанные здесь.
  • Я использую сложные классы менеджера для достижения методов, требующих более одного менеджера.(Как и метод createAccount, который имеет место в классе AccountComplexManager, создает два класса POCO и добавляет их в базу данных.).Там нет операций БД, за исключением фиксации изменений, внесенных здесь.Вызывается метод соответствующего класса менеджера, и этими методами методов классов менеджера выполняются операции с БД.
    • 1.Student POCO
    • 2.User POCO
  • Я создал 3 базовых класса для моих менеджеров, чтобы уменьшить количество фиктивного кода.
    • 1.MotherBaseManager class: объект UnitOfWork, созданный здесь и используемый всеми менеджерами, которые выполняют операции с БД.Этот класс также унаследован от следующих 2 классов.У него есть только метод Context, который возвращает объект UnitOfWork.
    • 2.BaseComplexManager class: базовый класс классов ComplexManager.Имеет метод GetManager для получения соответствующих менеджеров для выполнения некоторых задач БД и метод Save для фиксации изменений в БД.
    • 3. Класс BaseManager: Базовый класс классов Manager.Он имеет класс Get Repository, чтобы получить соответствующие классы репозитория для выполнения операций с БД, таких как CRUD.

My Class View откорректированной версии Business Layer:

Я хочу очистить dbSet local от объектов с попыткой вставки без перезапуска приложения, чтобы дать пользователям возможность исправить свои ошибки и снова создать учетную запись.

Если у меня естьошибся или ошибся в какой-то момент, пожалуйста, прости меня.Любая помощь будет оценена.Спасибо!

1 Ответ

1 голос
/ 14 апреля 2019

Помимо очень правильного комментария от 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 Core или EF 6 .

Однако я бы посоветовал вам пересмотреть схему проверки.Проверка данных не должна выполняться на уровне базы данных - проверка должна происходить намного раньше в течение срока действия запроса, возможно, даже до того, как вы создадите POCO для хранения в базе данных.

...