2013-02-12 24 views
0

在工作中,我们正在寻找移动到一个ORM(仍然使用ADO访问数据库!)我开始构建实体框架,一切都顺利进行,直到我将它分离出来。 DLL(所以我们可以使网站/ crm/production/barcoding系统全部使用相同的数据库逻辑)。在dll中使用实体框架聚合异常

问题带有处理DbEntityValidationExceptions,我最初的测试代码(合作)

public override int SaveChanges(System.Data.Objects.SaveOptions options) 
     { 
      try{return base.SaveChanges(options);} 
      catch (DbEntityValidationException dbEx) 
      { 
       foreach (var validationErrors in dbEx.EntityValidationErrors) 
       { 
        foreach (var validationError in validationErrors.ValidationErrors) 
        { 
         Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}", 
          validationErrors.Entry.Entity.GetType().FullName, 
          validationError.PropertyName, 
          validationError.ErrorMessage); 
        } 
       } 
       //handle here 
       throw; 
      } 
     } 

但这并没有得到现在抓住和我留下处理的通用threadException。有没有什么办法可以访问原始数据(抛出threadException?)或者我应该采取不同的方法。我想我只需要一个正确的方向,我可以找出一些东西。

问候,皮特

UPDATE:

调用GetValidationErrors一个问题嗯位。我注意到我的数据库Context有ObjectContext的baseClass而不是DbContext(所以我不能调用ValidateEntity)。我使用的实体框架5与默认代码生成启用 - 使用数据库第一种方法,如果有帮助。

+0

是什么线程异常包含? – 2013-02-12 13:46:13

回答

1

在致电SaveChanges之前检查是否存在验证错误。像...

var errors = context.GetValidationErrors(); 
if(errors.Any()) 
{ 
    //handle validation errors 
} 
else 
{ 
    context.SaveChanges(); 
} 

从内存,所以确切的语法可能不正确。

+0

好的,谢谢你,我会尽快尝试你和Jens的建议并看看! – 2013-02-12 14:17:00

+0

阅读了更多内容之后 - 似乎ValidateEntity方法仅适用于DbContext。所以我想我要么找出一种方法来让默认代码生成给我DbContext或坚持ObjectContext并编写我自己的方法来验证实体。 – 2013-02-12 16:54:17

+0

使用Entity Framework强大工具,我能够逆向工程数据库优先方法并创建DbContext。我用类似的方法来抓住他们。我会在完成后发布完成的代码,感谢您的帮助。 – 2013-02-13 14:05:25

0

这是我结束了到底去(我可能会最终充实它,因为我更多地了解EF)

 public List<DbEntityValidationException> vErrors = new List<DbEntityValidationException>(); 
     public int DbChanges = 0;  

     public bool SaveChanges() 
     { 
      try 
      { 
       this.vErrors = (List<DbEntityValidationException>)base.GetValidationErrors(); 
       if (this.vErrors.Count == 0) 
       { 
        this.DbChanges = base.SaveChanges(); 
        return true; 
       } 
      } 
      catch (Exception Ex) 
      { 
       this.vErrors.Add(new DbEntityValidationException(string.Format("General Error: {0}", Ex.GetType().ToString()))); 
      } 
      return false; 
     } 

,并从代码

using(Db db = new Db()) 
{ 
//changes 
if(db.SaveChanges) 
{ 
    //some message using db.DbChanges 
} 
else 
{ 
    //handle errors in db.vErrors 
}