EF EntityState.Modified尝试捕获问题

时间:2016-02-01 14:16:27

标签: c# entity-framework

我有这样的代码:

[StringLength(5)]
public string Name { get; set; }

和实体:

var canvas = new fabric.Canvas('c');
var str = '<svg width="640" height="480" xmlns="http://www.w3.org/2000/svg"><g><ellipse ry="63" rx="63" id="svg_1" cy="225" cx="181" stroke-width="0" fill="#FF0000"/><rect id="svg_2" height="113.99999" width="212.99999" y="169" x="299.00001" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" fill="#FF0000"/></g></svg>';
var svg;
fabric.loadSVGFromString(str, function(objects, options) {
  svg = fabric.util.groupSVGElements(objects,options);
  svg.scaleToHeight(canvas.height);
  canvas.add(svg);
  svg.center();
  canvas.renderAll();
  svg.setCoords();
  var bounds = svg.getObjects();
  console.log(bounds[1]);
  bounds[0].group.setFill('#00000');
  
  fabric.loadSVGFromString(str, function(objects, options) {		
    var group = new fabric.Group(objects,options);
    canvas.add(group);
    group.scaleToHeight(canvas.getHeight());
    canvas.renderAll();
    var items = group._objects;
    group._restoreObjectsState();
    canvas.remove(group);    
    for(var i = 0; i < items.length; i++) {	
    	items[i].set({
      	left:svg.getLeft() + bounds[i].getLeft()*svg.getScaleX(),
        top:svg.getTop() + bounds[i].getTop()*svg.getScaleY(),
      });
      canvas.add(items[i]);
    }    
	}); 
  
});

如果Name String超过5则会出错并捕获异常,但是当我添加日志然后保存时,SaveChange()的异常;仍然存在,我该怎么做?(不能改变架构)

1 个答案:

答案 0 :(得分:1)

  

SaveChange()的例外;仍然存在

好吧,如果这引发异常:

database.SaveChanges();

然后很好的机会 这个也会抛出异常:

database.SaveChanges();

基本上,在catch块中,您不应该立即重新尝试在毫秒前失败的操作。而是记录失败并处理异常:

catch (Exception ex)
{
    // DO NOT call SaveChanges() here.
}

当然,如果写入数据库失败,那么登录到数据库可能会失败。例如,假设连接字符串错误或数据库已关闭或超时。你不能记录它。

我建议使用日志框架(log4net,NLog等)作为Entity Framework数据访问层的单独依赖项。这是一个很小的学习曲线,但你最终得到了一个非常强大的日志系统,可以更有效地处理问题。 可以轻松配置为记录到多个位置,因此如果写入一个错误日志(数据库)失败,那么您还有另一个(例如文件)。

至少,如果持久化数据上下文失败,则需要登录数据上下文。否则失败的部分仍在那里。

结构更像是这样的东西:

try
{
    using (var database = new DbContext())
    {
        Member member = database.Members.Where(m=>m.ID=1).FirstOrDefault();
        member.Name = "NewMemberName";
        database.Entry(member).State = EntityState.Modified;
        database.SaveChanges();
    }
}
catch (Exception ex)
{
    using (var database = new DbContext())
    {
        database.Logs.Add(new Log() { Value=ex.ToString() });
        database.SaveChanges();
    }
}