私は、SQLで2分でできることを実行できるように、最初にEFコードを取得しようとしている大失敗です。それを機能させるためにまだ5日間を費やしていなければ、データベースをDDLでコーディングし、ADO.NETを使用するだけでした。しかし、私は逸脱します...
Aの各レコードにBの対応するレコードがある、2つのテーブルが必要です。これらは両方とも同じオブジェクトの一部です。私が入らない理由で、それらは別々のテーブルにある必要があります(しかし、実際にはそうなので、そこには行かないでください)。データベース側から設計する場合は、BからAへのFK関係があります。ジョブは完了です。
EF Code Firstでは、共有主キー方式と1対1の外部キー関連付け方式の両方を使用しようとしましたが、どちらも機能しません。私はまた、私が考えることができるすべての変種の100かそこらの組み合わせを試しました、そして私はそれ以上前進しません。
私が言ったように、私が望んでいるのは、AからBへのナビゲート可能な関係があり(そして戻るのは良いことですが、それは不可能だと読んだことがあります)、その関係が遅延ロードされることです。a.b
bのフィールドにアクセスできます。
私が試したすべてのことを列挙することはおそらくできないので、ほとんど機能するものの例を挙げましょう。
class Foo
{
public int Id { get; set; }
public string FooProperty { get; set; }
public virtual Bar Bar { get; set; }
}
class Bar
{
public int Id { get; set; }
public string BarProperty { get; set; }
}
(a)SQL Serverは複数のカスケード削除パスについて文句を言い、(b)EFはどちらの側が関連付けの主要な端であるかわからないことについて文句を言うので、BarからFooへの逆参照がないことに注意してください。だから...大丈夫-私はそれなしで生きることができます。
これがデータベースで私を取得するのは、とフィールドを持つテーブルFoos
とId
、FooProperty
とBar_Id
フィールドを持つBars
テーブルです。これは、SQLでモデル化する方法にかなり近いものですが、おそらくFKフィールドをではなく入力するでしょう。しかし、1:1なので、それほど重要ではないと思います。Id
BarProperty
Bar
Foo
これがほぼ機能すると言う理由は、とを追加してBar
からFoo
それらを再度ロードするとBar
、オブジェクトのプロパティFoo
がnullになるためです。
using (var dbContext = new MyDbContext())
{
var foo = dbContext.Foos.Create();
foo.FooProperty = "Hello";
dbContext.Foos.Add(foo);
var bar = dbContext.Bars.Create();
bar.BarProperty = "world";
foo.Bar = bar;
dbContext.SaveChanges();
}
using (var dbContext = new MyDbContext())
{
foreach (var foo in dbContext.Foos)
Console.WriteLine(foo.Bar.Id); // BOOM! foo.Bar is null
}
foo.Bar
通常、の評価がオブジェクトの遅延読み込みをトリガーすることを期待しBar
ますが、そうではありません-そのプロパティは残りnull
ます。
どうすれば修正できますか?