2016-12-15 9 views
1

今日、私はEF6の組み込み規約に問題がありました。デバッグすることで、最初のコードでEF6がデフォルトの規約をすべて有効にすることがわかりました。EF6のすべての規約を無効にする

私はマッパークラスを使って見栄えの良いモデルマッピングを生成しているので、私はちょうど私のデータモデルを変更するために慣習をしたくありません。具体的には

、FK列が正しくlinkedentityとしてマッピングされているとき、私は、理由SQLに入った偽のコラムExtent1.LinkedEntity_idの簡単なSELECTクエリを実行することはできませんし、私は私の中で別の名前を使用する理由がありませんデータベース。

このコードファーストモデルは、DBファーストからリバースエンジニアリングされています。データベースのルールと私はそのデザインを変更することはできません。

質問:すべての規約を一度に無効にするにはどうすればよいですか? .Clearメソッドが見つかりませんでした。DbModelBuilder.Conventions

+0

DBが存在し、変更できない場合は、なぜコードファーストを使用しますか?データベースの場合のように見えます。 – Sefe

+0

これは長い話です。基本的には、プロジェクトではなく、**製品**を維持しています。単一のDBはありません。アプリケーションがインストールされている各顧客サイトでDBを展開、保守、移行する必要があります。実際、2つの異なるEFユーティリティー・ライブラリーを使用してバルク・インサートの失敗から始まったのは長い話です。 –

+0

実際、EDMXモデルを最初にコード化する前に、この問題は発生しませんでした。 –

答えて

1

本来の方法はありません。しかし、リフレクションを使うことは可能かもしれません。すべての慣習を見つけ、それからRemoveを呼び出します。このような何かを助ける必要があります。

private void RemoveAllConventions(DbModelBuilder modelBuilder) 
    { 

     var conventions = AppDomain.CurrentDomain.GetAssemblies() 
      .SelectMany(a => a.GetTypes().Where(t => t.IsClass && t.GetInterface("IConvention") != null)); 


     var remove = typeof(ConventionsConfiguration).GetMethods().Where(m => m.Name == "Remove" && m.ContainsGenericParameters).First(); 
     foreach (var item in conventions) 
     { 
      try 
      { 
       remove.MakeGenericMethod(item).Invoke(modelBuilder.Conventions, null); 
      } 
      catch (Exception) 
      { 
      } 
     } 
    } 

そして、あなたのOnModelCreatingに:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     RemoveAllConventions(modelBuilder); 
    } 

はこのコンセプトに多くの反復とあなたの調査結果を折り返し報告すること自由に感じなさい。

+0

こんにちは、これは私の質問(私は少し微調整をしなければならなかったが)に正しい解決策でしたが、とにかく議論のために私の根本的な問題を解決しませんでした。私はいつかEF7にアップグレードしたいと思いますが、それは書き直しを意味します –

関連する問題