0

私のasp.netmvc3アプリでは、LinqToSqlによって生成されたSQLコードを追跡したいと思います。ファイルに書きたいです。これが私がすることです:

web.configの変更:

<system.diagnostics>
<trace autoflush="true" indentsize="4">
  <listeners>
    <add name="myListener" 
         type="System.Diagnostics.TextWriterTraceListener" 
         initializeData="LogLinqToSql.log" />
    <remove name="Default" />
  </listeners>
</trace>
</system.diagnostics>

ファイルへの書き込みに役立つクラスを作成しました(1つのチュートリアルで見つけました)。

public class LogLinqToSql : TextWriter
{
    public override void Write(string value)
    {
        Debug.Write(value);
    }
    public override void Write(char[] buffer, int index, int count)
    {
        Debug.Write(new String(buffer, index, count));
    }
    public override System.Text.Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}

そして、リポジトリからアイテムを取得するために使用され、ビューモデルを使用するStoreControllerアクションメソッドContentの変更(コードが機能しないため、マビー):

#define TRACE 

public ViewResult Content(string category, int page = 1)
{
    var context = new WebStoreDataContext();

     Trace.WriteLine("StoreController.Content BEGINS");
     context.Log = Console.Out;

     var model = new StoreContentViewModel
            {
                Items = _itemsRepository.GetItems()
                             .Where(i => category == null || (i.Product != null && i.Product.Category == category))
                             .OrderBy(i => i.ItemId)
                             .Skip((page - 1) * PageSize)
                             .Take(PageSize),

                // initializing other properties
            };

        context.Log = new LogLinqToSql();
        context.SubmitChanges();
        Trace.WriteLine("StoreController.Content ENDS");
        Trace.WriteLine("");

        return View(model);         
}

.logファイルには「BEGIN」行と「END」行のみが表示されます。

だから、私は完全に間違ったことをしていて、ログ情報をファイルに書き込む別のアプローチがありますか、それとも一部を修正する必要がありますか?

よろしくお願いします!

編集:

また、アクションメソッドでこれを試しました:

context.Log = new StreamWriter(@"C:\Users\Aleksey\repos\2\WebStore\WebStore\LogLinqToSql.log");  

しかし、IOExceptionが発生します。このファイルはすでに他のプロセスによって使用されているため、プロセスはこのファイルにアクセスできません。

これが同じ質問です

4

1 に答える 1

0

context.Log を実際のクエリが作成されるデータ モデル クラスに入れる必要がありました。ItemsRepository クラスのメソッドは次のとおりです。

public IEnumerable<Item> GetItems(string category)
    {
        // writing info into Trace file
        _dataContext.Log = Console.Out;

        var result = _dataContext.Items.Where(
            i => category == null || (i.Product != null && i.Product.Category == category))
                                 .OrderBy(i => i.ItemId);

        _dataContext.Log = new LogLinqToSql();
        _dataContext.SubmitChanges();
        return result;
    }
于 2013-01-16T17:38:42.917 に答える