我是一名試圖首先獲取EF代碼以讓我在SQL中執行2分鐘內完成的操作的沉船殘骸。如果我已經花了5天的時間試圖使它工作,我只需在DDL中編寫我的數據庫並使用ADO.NET。但我離題...如何在EF 5 Code First中使用一個Bar作爲Foo
我想有2個表,其中A中的每個記錄都有一個相應的記錄B.他們都是同一個對象的一部分;他們需要在單獨的桌子上,因爲我不會去(但他們真的這樣做,所以不要去那裏)。如果我是從數據庫端進行設計的,我只需要從B到A的FK關係。
在EF代碼中,我試過使用shared primary key method和one-to-one foreign key association方法,但都不適用於我。我也試過了所有我能想到的變體的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會抱怨不知道哪一邊是該關聯的主要端點。所以...很好 - 我可以沒有它。
這是什麼讓我的數據庫是一個Foos
表Id
,FooProperty
和Bar_Id
領域和Bars
表Id
和BarProperty
領域。這與我在SQL中建模的方式非常接近,但我可能會將FK字段放在Bar
而不是Foo
。但是,因爲它是1:1,所以這並不重要,我想。
我說,這幾乎成功運作的原因是,如果我添加Bar
和相關Foo
,然後加載它們放回時,Foo
對象的Bar
屬性爲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
。
我該如何解決?
@LueTim:謝謝,但這不**工作。這是我嘗試過的很多事情之一(實際上,這篇博客文章與我在我的問題中提到的那篇博客文章是一樣的 - 這似乎是大家*指出的一件事!)。 – 2012-08-06 21:13:33
所以,我從中得到的是帶有Id和BarId字段的Foos表格,以及帶有Id和FooId字段的Bars表格。只有Bars表中的Id是標識列,並且兩個Id列之間有FK關係。 – 2012-08-06 21:15:34
代碼運行時,Foo對象的Bar屬性與以前一樣爲null。更糟糕的是,在對象和數據庫中,框架都沒有設置FooId和BarId字段。EF似乎完全忽略了它們。所以實際上這個特定的配置功能遠不如我的問題的出發點。 – 2012-08-06 21:16:41