3

私はEntity Frameworkが初めてで、そのためのORMがあります。私が関与しているプロジェクトには、すべてのキーが文字列であり、大文字と小文字が区別されないレガシー データベースがあります。

MSSQL に変換中で、EF を ORM として使用したいのですが、問題が発生しました。

以下は、私たちの問題を示す例です。

TableA にはプライマリ文字列キーがあり、TableB にはこのプライマリ キーへの参照があります。

LINQ では、次のように記述します。


var result = from t in context.TableB select t.TableA;
foreach( var r in result )
    Console.WriteLine( r.someFieldInTableA );  

TableA に "A" を読み取る主キーが含まれており、TableB に TableA を参照する 2 つの行が含まれているが、参照フィールドの大文字と小文字が異なる "a" と "A" の場合。

私たちのプロジェクトでは、両方の行が結果に含まれるようにしたいのですが、大文字と小文字が一致する行のみが結果に含まれます。

SQL プロファイラーを使用して、両方の行が選択されていることに気付きました。

キーが大文字と小文字を区別しないことを Entity Framework に伝える方法はありますか?

編集:
これを NHibernate でテストしたところ、NHibernate は大文字と小文字を区別しないキーで動作するという結論に達しました。したがって、NHibernate の方が適している可能性があります。
ただし、Entity Framework の動作を変更する方法があるかどうかを知りたいと思っています。


ご回答有難うございます!

問題は、その制約を今データベースに追加すると、その構築方法が原因でレガシー アプリケーションが動作しなくなる可能性があることです。可能であれば、EF の動作を変更することをお勧めします。無理だとは思いますが、頑張ってみます。


よろしく、
フレドリック

編集:自分の質問に回答を追加した理由は、登録ユーザーになる前にこの質問を追加したためです。アカウントを登録すると、コメントを追加したり、投稿を編集したりできませんでした。これでアカウントが統合されました。

4

5 に答える 5

2

これが完璧な解決策ではないことはわかっていますが、LINQ では自分で参加してみませんか。結合を行うときに .Designer.cs ファイルが objA.Equals(objB) を返すため、EF は機能しません。.Equals は大文字と小文字を区別します。

var result = from t1 in context.TableB 結合 t2 in context.TableA on t1.someFieldInTableB.ToUpper() equals t2.someFieldInTableA.ToUpper();

私は知っていますが、LINQ to Entities はまだ初期段階にあり、設計されているオブジェクト クラスは、このような設計の例外的なケースを処理しない特定の理由で設計されています。

もう 1 つの方法は、T4 テンプレートを使用して独自のコード ジェネレーターを作成することです。すべてが public 部分クラスであるため、探している大文字と小文字を区別しない比較を実際に行うナビゲーション プロパティを作成できます。

ただし、質問に正直に答えるために、大文字と小文字を区別しない検索を使用して EF にナビゲーションを実行させる「すぐに使える」方法はありません。

于 2009-04-19T02:02:56.373 に答える
0

コンテキストがデータベースから行を取得した後、メモリ内の文字列ベースの関連付けを「ステッチアップ」する回避策を思いつきました(ヒント:コンテキストを使用します。[EntityTypeCollection]。ローカルプロパティ。httpsで私の答えを見ることができます://stackoverflow.com/a/12557796/62278

于 2012-09-24T01:30:02.507 に答える
0

これが完璧な解決策ではないことはわかっていますが、LINQ では自分で参加してみませんか。>> 結合を実行すると、.Designer.cs ファイルが objA.Equals(objB) を返すため、EF は機能しません。.Equals は大文字と小文字を区別します。

Equals メソッドをオーバーライドする場合はそうではありません

EF で生成されたドメイン クラスは部分的ですか? したがって、これらのクラスのデフォルトの Equals 実装を独自の実装に置き換えるのはかなり簡単です (もちろん、大文字と小文字を区別しません)。

ところで:.NET 1.0からさかのぼるテクニック

この .NET 3.5/4.0、Linq、Lambda の暴力により、人々は基本を忘れがちです。

于 2012-01-26T15:19:11.643 に答える
-1

Entity Framework の代わりに、LINQ to SQL を使用できます。これは、大文字と小文字を区別する照合を含むリレーションでうまく機能します。この ORM は EF や NHibernate のすべての柔軟性を提供するわけではありませんが、多くの場合は十分です。

最近、公式の Microsoft Entity Framework フォーラムにスレッドを投稿しました: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d4aa6880-31b3-4ff2-b7f5-e2694d76772e

于 2010-04-10T18:13:01.970 に答える