2017-05-01 7 views
1

Entityフレームワークによってデータベースに送信されているSQLをログに記録しようとしていますが、膨大な運がありません。私はコードを最初に新しいデータベースワークフローに取り組んでいますが、DbContextにプロパティを追加すると、データベースからOracleエラーが返ってきます。識別子が長すぎます。私はどのように私のテーブルを作成しようとしている識別子の名前が長すぎるかを識別するためにデータベースに送信されているSQLを見てみたいと思います。C#Entity Framework Logging(DbContext)が機能しない

現在、私は次のような場所にありますが、コードの実行中に呼び出されることはありません。私は例外が発生したのでデータがデータベースに送られていることを知っていますが、ロガーは決して実行されません。本当に変わったことがここにあります。時間の99%と同じように、インターセプタは動作しません。

public class DBLog 
{ 
    private string path = @"C:\users\myuser\desktop\oracleloggingtest1.txt"; 

    public void Log(string message) 
    { 
     File.AppendAllText(path, message); 
    } 
} 

... 
... 

DBLog lggr = new DBLog(); 
Database.SetInitializer(new DropCreateDatabaseAlways<TestDbContext>()); 
using (var context = new TestClearPersonModel()) 
     { 
      context.Database.Log = s => lggr.Log(s); 

      context.WorkAffiliations.Add(personReportResult.WorkAffiliations); 


      ... 

      context.SaveChanges(); 
     } 

識別子の1が長すぎるため、entityframeworkからの例外は、Oracleからcontext.workaffiliations.addラインにスローされますが、この情報のどれもが記録されません。

先日、私はこれを使いこなしていましたが、2,3日前にデスクトップにログファイルがあり、そこに古いデータが含まれているため、ログが機能しました。なぜ私は現在働いていないのか分かりません。私はこのデータを得るためにいくつかの異なる方法を試しました。

ご協力いただきましてありがとうございます。

EDIT: Tipxの提案を試してみると面白い開発...私は、異なる方法を使ってデータベースに行くsqlコマンドを記録できるように徹夜しています。私は、DB操作を開始する前に、私は関数呼び出しによって、プログラム登録IDbCommandInterceptorのセットアップを持っていた、そして私はentityframeworkセクションで私のアプリの設定でこれを持って、上記の方法を持っていた:このコードの

<interceptors> 
    <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
    <parameters> 
     <parameter value="C:\users\myuser\desktop\orclogtst.txt" /> 
    </parameters> 
    </interceptor> 
</interceptors> 

いずれも行われていませんランニング。私は試みたすべての異なるロギングメカニズムにブレークポイントを持っていて、決して呼び出されませんでした。私は数回、数十回試してみました。 Tipxが推奨する小さな変更を加えた後(ちょうどコンソールにログオンしようとしたところ)、突然両方の他のログ機能が働いた。 IDbCommandInterceptorのブレークポイントにデータを記録し、web.configファイルのインターセプタがそこに指定されたファイルにデータを記録していることがわかりました....

しかし、これはその実行時にのみ機能します。私は直ちに(何も変更せずに)自分のコードを再実行しようとしましたが、もう機能しませんでした。コードに変更を加えてコンパイルした後、Tipxで推奨された変更を追加しましたが、それでも機能しませんでした。これらのメソッドが何らかのコード変更なしで突然呼び出され、以来再び呼び出されることはありませんか?

+0

これは、SQLプロバイダではなくOracleプロバイダを使用して行う必要がありますか? – ImNotADrugDealer

答えて

1

データベースをクリアすると、ロギングが正常に行われます。最初にデータベースをクリアせずにコードを実行しようとすると、ロギングが機能しません。これは、通常のクラッシュ操作ではなく、モデルクラスからデータベーステーブルを生成しようとしている最中に起こったものと思われます。

2

私はプロバイダーと関係がないと思います。ファイルがオープン/ロックされているか、パーミッションが何らかの処理を行う可能性があります。ここで

は、私は問題が何であるかを見つけるために行うだろうものです:

context.Database.Log = s => lggr.Log(s);行を削除し、あなたのコンテキストコンストラクタでは、この追加:

Database.Log = (s) => { Console.WriteLine(s); }; 

をそしてにブレークポイントを置きますConsole.WriteLine、プログラムを実行し、ヒットしたかどうかを確認します。あなたがそうした場合、それはプロバイダとは何の関係もないことが分かります。あなたがしない場合は、どのクラスcontextを再確認してください。

また、サイドノートでは、NLogやLog4Netのようなロギングフレームワークの使用を検討する必要があります。最初にそれを動作させるには30分かかるかもしれませんが、それはそれに値するものです。また、私は個人的にクラス内のロガーを設定しました。コンテキストを使っているクラスは、あなたのコンテキストにログを伝えるべきではありません。それはビジネスではありません! :-P

+0

私は自分のlggr.log()にブレークポイントを設定していて、コードが実行されている間にコールされていないことがわかりました。ちょうどそれの地獄のために、私は先に行って置き換え: context.Database.Log = s => lggr.Log(s); との行: context.Database.Log =(s)=> {Console.WriteLine(s); }; ブレークポイントを設定し、コードを実行させます。 次に、私は本当に理解していない何かが起こった。先に設定したIDbCommandInterceptorがトリガされました。私はこれを知っています。なぜなら、私はインターフェイスでこれまでの方法でブレークポイントを持っていたからです。彼らは前に決して殴らなかった。しかし、その実行にのみ。もう一度起きていない – ImNotADrugDealer

+0

なぜこのインターセプターは突然動くのですか?これはずっと設定されており、変更されていません。上記の唯一の変更でこの実行で、突然働いた。しかし、それは一度だけ。コードを再実行しようとしましたが、もう動作しませんでした。変更を取り消して再割り当てしましたが、再作成できませんでした。何がそのようなことを引き起こす可能性がありますか?編集:私は同じ問題を解決するために、そのインターセプターをセットアップ言及する必要があります。 SQL文を記録しようとしています。インターセプターもロガーも呼ばれていませんでした。両方のブレークポイントがありました。 – ImNotADrugDealer

+0

ハム...私は言葉のために失われています。解決策全体を見ることなく、私は頭の上から何も考えていません。さて、私が考えることができるのは、デバッグ中に問題をスレッドすること、または「間違ってビルドした」ことだけである。 VSを閉じ、すべてのプロジェクトの "obj"と "bin"フォルダをすべて削除してから、VSを開いて再試行してください。私は他に何が言いたいのかわからない: - – Tipx

関連する問題