1

エラー メッセージをログに記録するために使用したいコードがあります。メッセージを保持するために、次のような 2 つのクラスを作成しました。

public class HttpStatusErrors
{
    public HttpStatusErrors()
    {
        this.Details = new List<HttpStatusErrorDetails>();
    }
    public string Header { set; get; }
    public IList<HttpStatusErrorDetails> Details { set; get; }
}
public class HttpStatusErrorDetails
{
    public HttpStatusErrorDetails()
    {
        this.Details = new List<string>();
    }
    public string Header { set; get; }
    public IList<string> Details { set; get; }
}

これはこれを行うための良い方法だと思いますが、100% 確信があるわけではなく、提案を歓迎します。

私がやりたいことはHeader、私の例では「検証メッセージ」になる最初のクラスに保存することです。次に、エラーのあるエンティティを示した別のオブジェクトをオブジェクトに保存し、最後に検証エラーDetailをストアに保存したいと思います。HeaderDetails

私が混乱しているのは、クラスをインスタンス化する方法です。私はこれまでこれを行ってきました。これは正しいと思います。しかし、追加する必要がある詳細を追加するにはどうすればよいですか:

catch (DbEntityValidationException ex)
{
    var msg = new HttpStatusErrors();
    msg.Header = "Validation Error";

    foreach (var eve in ex.EntityValidationErrors)
    {
        var header = string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            var detail = string.Format("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }

    }

}.
4

2 に答える 2

2

プロパティでコレクションをインスタンス化しDetailsます。新しいアイテムをインスタンス化し、ループでコレクションに追加します。

var msg = new HttpStatusErrors();
msg.Header = "Validation Error";
msg.Details = new List<HttpStatusErrorDetails>();

foreach (var eve in ex.EntityValidationErrors)
{
    var detail = new HttpStatusErrorDetails()
    detail.Header = String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
        eve.Entry.Entity.GetType().Name, eve.Entry.State);

    detail.Details = new List<string>();
    foreach (var ve in eve.ValidationErrors)
    {
        detail.Details.Add(String.Format("- Property: \"{0}\", Error: \"{1}\"",
            ve.PropertyName, ve.ErrorMessage));
    }

    msg.Details.Add(detail);
}

ところで、そのためにLINQを使用できます:

var msg = new HttpStatusErrors();
msg.Header = "Validation Error";
msg.Details =
    ex.EntityValidationErrors
      .Select(eve => new HttpStatusErrorDetails {
                Header = String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State)
                Details = eve.ValidationErrors
                         .Select(ve => String.Format("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage))
                         .ToList()
       }).ToList();

また、拡張メソッドの構文も好きです。

 public static HttpStatusErrors ToHttpStatusErrors(
      this DbEntityValidationException ex)
 {
      return new HttpStatusErrors {
          Header = "Validation Error",
          Details = ex.EntityValidationErrors
                      .Select(eve => eve.ToHttpStatusErrorDetails())
                      .ToList()
      };
 }

 public static HttpStatusErrorDetails ToHttpStatusErrorDetails(
      this DbEntityValidationResult eve)
 {
      return new HttpStatusErrorDetails {
        Header = String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                               eve.Entry.Entity.GetType().Name, eve.Entry.State),
        Details = eve.ValidationErrors
                     .Select(ve => ve.ToErrorDescription())
                     .ToList()
      };
 }

 public static string ToErrorDescription(
      this DbValidationError ve)
 {
      return String.Format("- Property: \"{0}\", Error: \"{1}\"",
                           ve.PropertyName, ve.ErrorMessage);
 }

このようなメソッドの使用法は次のようになります。

catch (DbEntityValidationException ex)
{
    var msg = ex.ToHttpStatusErrors();
}
于 2013-08-15T14:35:17.573 に答える
0

次のことを試してください。

foreach (var eve in ex.EntityValidationErrors)
{
    //New Details Entity
    var errorDetail = new HttpStatusErrorDetails();

    //Fill in Header
    errorDetail.Header = string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
        eve.Entry.Entity.GetType().Name, eve.Entry.State);

    //Fill Add a detail for each validation error
    foreach (var ve in eve.ValidationErrors)
    {
        errorDetail.Details.Add(string.Format("- Property: \"{0}\", Error: \"{1}\"",
            ve.PropertyName, ve.ErrorMessage));
    }

    //Add Detail to header
    msg.Details.Add(errorDetail);
}
于 2013-08-15T14:37:11.023 に答える