0

在我的 asp.net mvc 3 应用程序中,我想跟踪由 Linq To Sql 生成的 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>

我创建了一个应该有助于写入文件的类(刚刚在一个教程中找到它):

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 的更改(mabby 因为它我的代码不起作用):

#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);         
}

只有“BEGIN”和“END”行出现在 .log 文件中。

那么,我是在做完全错误的事情吗?还有另一种方法可以将日志信息写入文件,或者我只需要修复某些部分???

提前感谢您的帮助!

编辑:

还尝试了此操作方法:

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 回答