2

foreachループで「エンティティ例外がユーザーコードによって処理されませんでした」というエラーが発生します。なぜこうなった?私は何が間違っているのですか?

    public IList<ProductDTO> GetProducts()
    {
        IList<ProductDTO> listofproducts = new List<ProductDTO>();
        using (var db = new NORTHWNDEntities())
        {
            var query = from p in db.Products
                        select new
                                   {
                                       Name = p.ProductName,
                                   };

エラーは彼女のforeachで発生します。

                *foreach (var product in query)*
                {
                    listofproducts.Add(new ProductDTO { Name = product.Name });
                }
            }
        return listofproducts;

    }
4

3 に答える 3

3

問題がどこにあるのか正確な問題を見つけたい場合は、この方法でtrycatchステートメントにコードを記述してください。

try
{
  //write code

} 
catch (System.Data.Entity.Validation.DbEntityValidationException ex)
            {
                var outputLines = new List<string>();
                foreach (var eve in ex.EntityValidationErrors)
                {
                    outputLines.Add(string.Format(
                        "{0}: Entity of type \"{1}\" in state \"{2}\" has the following validation errors:",
                        DateTime.Now, eve.Entry.Entity.GetType().Name, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        outputLines.Add(string.Format(
                            "- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage));
                    }
                }
                System.IO.File.AppendAllLines(@"c:\temp\errors.txt", outputLines);
            }
于 2016-12-08T09:16:40.083 に答える
1

まず、データソースにアクセスできるかどうかを確認します。問題がない場合は、クエリ構造を確認する必要があります。クエリを繰り返し処理していますが、クエリ結果は繰り返し処理していません。ToListメソッドを使用して、クエリをListに変換し、反復処理します。クエリ結果をリストに変換するには、Enumerable.ToListメソッドを使用する必要があります。

var query = (from p in db.Products
              select new
              {
                    Name = p.ProductName,
              }).ToList();

foreach (var product in query)*
{
      listofproducts.Add(new ProductDTO { Name = product.Name });
}

ProductDTO投影を使用したオブジェクトを直接作成できます。

IList<ProductDTO> listOfProcuts = (from p in db.Products
                                   select new ProductDTO 
                                   {
                                       Name = p.ProductName,
                                   }).ToList();

return listOfProcuts ;
于 2012-12-23T13:07:43.977 に答える
0

アディルの答えは正しく、あなたの問題を解決するでしょうが、あなたはIEnumerable<ProductDTO>の代わりに戻ることを検討するかもしれませんIList<DTO>

情報隠蔽の原則に従い、GetProducts()を呼び出すプログラムの他の部分がリストのセマンティクスを必要としない場合、IList<T>セマンティクスは表示されません。

于 2012-12-23T13:17:37.397 に答える