2017-05-08 122 views
1

我試圖在實體框架和我的SQL Server與Fluent API之間建立關係。以下是我插入:實體框架中的一對多關係返回null

CREATE TABLE Product (
    id INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    name VARCHAR(255) 
); 

CREATE TABLE OrderLine (
    id INT PRIMARY KEY NOT NULL IDENTITY(1,1), 
    productId INT NOT NULL, 
    FOREIGN KEY (productId) REFERENCES Product(id) 
); 

現在,product有許多orderLine S,但不知道他們並不需要知道這些。例如,我們不需要選擇單一產品並計算訂單數量。下面是它的外觀:

public class Product { 
    public int id { get; set; } 

    public string name { get; set; } 

    public ICollection<OrderLine> orderLines { get; set; } //not needed but we'll have it anyway 
} 


public class OrderLine { 
    public int id { get; set; } 

    public int productId { get; set; } 

    public Product product { get; set; } 
} 

根據entityframeworktutorial.net這可能應該工作:

modelBuilder.Entity<Product>() 
    .HasMany<OrderLine>(s => s.orderLines) 
    .WithRequired(s => s.product) 
    .HasForeignKey(s => s.productId); 

然而,product簡直是空當我試圖把它拉出來的數據庫。這不是一對多的關係嗎?我不太確定我出錯的地方。

+0

您是否在查詢中包含屬性,例如'db.OrderLines.Include(e => e.product).ToList();'? –

+0

@SirRufo不,我不知道該怎麼做。我們有一個'Order',它有一個'OrderLines'列表,它有'Product'。所以它就像這樣:'db.Orders.First()。orderLines.First()。product.name',如果這是有道理的。抓住第一個訂單,抓住第一個訂單,抓住產品,給我名字。 – MortenMoulder

回答

3

我不確定這是否是整個問題,因爲那裏沒有那麼多的信息,但爲了延遲加載(它看起來像你正在嘗試),導航屬性必須被標記爲像這樣虛擬。 ..

public virtual Product product { get; set; } 

否則EF的代理不能包裝它們並做它的東西。

+0

這是我的不好,我已經有虛擬。 – MortenMoulder

+0

好吧,我不知道產品也必須是虛擬的。我只在productId上擁有它。非常感謝,現在就工作! – MortenMoulder

0

如果您沒有啓用延遲加載,EF默認情況下不會獲取相關實體。 嘗試包括您在選擇數據所需要的實體:

var product = _db.OrderLine.Include(p=>p.Product) 

其他的解決方法是激活模型構建器的惰性加載,但要注意,到複雜的查詢或大型表這可能會導致應用程序的性能一個很大的打擊。