来自EntityFramework上下文的SaveChanges()静默失败
本文关键字:静默 失败 SaveChanges EntityFramework 上下文 来自 | 更新日期: 2023-09-27 18:10:57
我使用实体框架6.1模型从数据库'向导'设置。当我从上下文创建一个Business对象,然后尝试添加for附件,然后SaveChanges()时,什么都没有发生。是否有跟踪模式?或者我可以打开看看被子下面到底发生了什么。
简单的例子:
var fb = _context.Business.Create();
//fb.Id exists and is an int but it is auto incr in the db
fb.Name = ub.ACCOUNT_NAME;
fb.ServiceManager = ub.SERVICE_MANAGER;
fb.AccountManager = ub.ACCOUNT_MANAGER;
fb.SalesPerson = ub.SALESPERSON;
fb.Created = DateTime.UtcNow;
fb.Updated = DateTime.UtcNow;
_context.Add(fb);
_context.SaveChanges();
我发现捕获EF错误的最佳方法是重写SaveChange方法,如下所示。如果您有一个中心位置来恢复日志(如log4net),该函数将能够在那里插入日志。
public partial class Business
{
/// <summary>Override the SaveChange to return better error messages</summary>
public override int SaveChanges()
{
try {
return base.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException ex) {
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Add some logging with log4net here
// Throw a new DbEntityValidationException with the improved exception message.
throw new System.Data.Entity.Validation.DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
您是否尝试检查任何验证错误?
这是我在一个新类中使用的try块和验证方法,所以把它当作一个代码样本,而不是100%测试的解决方案,因为我仍然把一些单元测试放在一起:
public List<string> ValidationErrorList = new List<string>();
try
{
_context.SaveChanges();
}
catch (Exception)
{
GetErrors(_context);
}
private void GetErrors(System.Data.Entity.DbContext context)
{
IEnumerable<System.Data.Entity.Validation.DbEntityValidationResult> ve;
ve = context.GetValidationErrors();
ValidationErrorList.Clear();
foreach (var vr in ve)
{
if (vr.IsValid == false)
{
foreach (var e in vr.ValidationErrors)
{
var errorMessage = e.PropertyName.Trim() + " : " +
e.ErrorMessage;
ValidationErrorList.Add(errorMessage);
}
}
}
}
虽然上面的示例只在触发异常时调用GetErrors方法,但您可能还想尝试在SaveChanges()之后调用它,以查看是否存在没有抛出异常的验证错误。
您是否尝试过创建一个新的Business对象并将其添加进去?而不是先创造一个?
var fb = new Business();
//fb.Id exists and is an int but it is auto incr in the db
fb.Name = ub.ACCOUNT_NAME;
fb.ServiceManager = ub.SERVICE_MANAGER;
fb.AccountManager = ub.ACCOUNT_MANAGER;
fb.SalesPerson = ub.SALESPERSON;
fb.Created = DateTime.UtcNow;
fb.Updated = DateTime.UtcNow;
_context.Business.Add(fb);
_context.SaveChanges();