5

私は少し Linq の初心者であり、非常に些細な問題と思われる問題を解決するためのドキュメントを見つけることができませんでした。

同じサーバー上に、データベース内のテーブルへの「疑似」外部キーを持つTable1データベース内のテーブルがあります。「疑似」。明らかに、2 つのデータベースにまたがる実際のFK を持つことはできないためです。DB1Table2IDTable2DB2

今、私は O/R デザイナで遊んでいます。デザイナにデータベース オブジェクトを持ち込むと、すべてのリレーションシップが生成される方法が気に入っています...とてもクールです! そして、 のすべての「実際の」外部キー関連オブジェクトとの関係があるように、Table1オブジェクトに との関係を持たせたいと考えています。しかし、間違った DB にあるため、DB ダイアグラムに取り込めません。Table2DB1Table2

これを合成するために、でビューTable2を作成してみました。あはは、オブジェクトをダイアグラムにドロップできるようになりました。と の間に親子関係を作ることもできます。しかし、生成されたコードを見ると、まだ との関係がなく、最も困惑しています。DB1select * from DB2..Table2Table2Table1Table2Table1Table2

私はどこかでステップを逃していますか?これを行うためのより良い/推奨される方法はありますか?

ありがとう!


後で...

ある人が提案したことに沿って、同じ DB 内の関連するオブジェクトのすべての構造をコピーすることにより、 の部分クラスにTable1にアクセスするために必要なすべてのメソッドを埋めようとしました。Table2

これは実際には読み取りに対して機能しましたが、レコードを更新または挿入しようとするとすぐに例外が発生しました。

An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.

したがって、Linq の設計者は実際にこのシナリオについて考え、異なるデータベース内のオブジェクトを接続することは許可されていないと判断したようです。それは本当に残念です... :(


...さらにその後...

@williammandra.com のおかげで、ビューに主キーを手動で作成する必要があることがわかりました。しかし、まだ別の問題があります。何らかの理由で、ビューから値をロードTable2して新しいレコードに設定し、変更をコミットすると、新しいレコードをTable1に挿入しようとするため、明らかに PK 違反が発生します。なぜこれが起こるのか、それを回避する方法はありますか?Table2

4

3 に答える 3

4

ビューには主キーがありません (主キーがないと、O/R デザイナーは関係を作成できません)。ビューを使用するソリューションは、途中まで到達します....不足している手順は、Table2 ビューのキー フィールドの O/R デザイナーで「主キー」プロパティを true に設定することです。手動で関連付けを作成する必要がありますが、dbml を保存すると、生成されたコードに関係が表示されます。

于 2009-04-23T19:30:35.890 に答える
0

各データベースに 1 つずつ、合計 2 つの dbml を作成できます。次に、クエリでテーブルを結合します。

var tb1 = DataContext1.Table1
var tb2 = DataContext2.Table2

var result = (from t1 in tb1
              join t2 in tb2 on tb1.column equals tb2.column
              where ...
              select ...
             )

別のデータコンテキストではなく、ビューに tb2 = を設定することもできます...

于 2009-04-23T17:09:03.607 に答える
0

あるデータベースから別のデータベースにアクセスできると仮定すると、.dbml ファイルを手動で編集することでこれを行うことができます。

<Table Name="Table1.dbo.Table" Member="MemberObject"> 
<Table Name="Table2.dbo.Table" Member="MemberObject">

テーブルのプロパティを調べてソースを変更することで、実際にこれを行うことができる場合があります。

于 2009-04-23T17:12:51.757 に答える