我目前正在为一所大学开发一个项目,该项目为学生提供了一个帐户,他们可以使用该帐户计算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条记录一样。这是屏幕截图:
这是我的业务层逻辑:
调整后的业务层版本的我的班级视图是:
我想从插入尝试对象中清除dbSet local而不重新启动应用程序,以使用户有机会纠正他们的错误并再次创建帐户。
如果我在某个时候拼错或弄错了,请原谅我。任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
除了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之前进行。