我有这样的代码:
[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()的异常;仍然存在,我该怎么做?(不能改变架构)
答案 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();
}
}