如何从 DbContext 中清除未插入的 POCO? - Entity Framework 代码优先

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

我目前正在为一所大学开发一个项目,让学生创建一个帐户,他们可以使用这个帐户计算他们的 GPA、访问论坛和屏幕共享。我正在使用 ASP.NET MVC 和 ASP.NET Web Api 技术。我开发了我的业务层并制作了 "Manager" classes,这有助于为我的项目的所有 POCO 进行数据库操作。我的所有管理器 classes 使用相同的 DbContext,它来自 BaseManager class。我在我的 POCO classes 中有一些规则,如果 creedientals 是错误的,可以防止数据库插入。

当我输入错误的这些字段时,数据库插入如预期的那样失败。但是在那之后,当我插入正确的值时(将值输入到不应为 null 的字段等),数据库插入再次失败,并且尽管错误已得到纠正,但仍显示与失败尝试之前相同的验证错误。

这是我的用户 POCO class(我正在分享我正在谈论的 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 class 的 DbSet 时,我看到我尝试的所有对象也都保存在本地,就像我在数据库中的 2 条记录一样。这是屏幕截图:

这是我的业务层逻辑:

我的Class业务层调整后的视图是:

我想在不重新启动应用程序的情况下从尝试插入的对象中清除 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 Core or EF 6 中事务的更多信息。

但是,我建议您重新考虑您的验证方案。数据验证不应该发生在数据库级别 - 验证应该在请求生命周期的早期发生,甚至可能在您创建要存储到数据库的 POCO 之前。