2014-12-13 19 views
0

我嘗試實現與實體框架6的1..0關係。我使用實例關聯。我試圖重複從網絡和論壇的例子,但不知何故它不適合我。請幫忙。EF 6.0中的空聯合實體Fluent Api

實體:

public class CustomerWithFk : Item // Item contains Id 
    { 
     public string Name { get; protected set; } 
     public virtual City City { get; set; }  // relation property. Can be 1 or 0 
     public virtual Product Product { get; set; } 
     public decimal Money { get; protected set; } 
    } 

    public class City : Item 
    { 
     public string Name { get; protected set; } 
    } 

映射:

public CityMap() 
{ 
    ToTable("Cities"); 
    HasKey(c => c.Id); 
} 

public CustomerFkAssosiationMap() 
{ 
    ToTable("Customers"); 
    HasKey(c => c.Id); 

    HasRequired(g => g.City) 
     .WithRequiredDependent(); 

    HasRequired(g => g.Product) 
       .WithRequiredDependent() 
       .Map(x => x.MapKey("ProductId")); 
} 

數據庫表: enter image description here

SQL事件探查器給我enxt SQL請求:

SELECT 
    1 AS [C1], 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Money] AS [Money], 
    [Extent1].[CityId] AS [CityId], 
    [Extent1].[ProductId] AS [ProductId] 
    FROM [dbo].[Customers] AS [Extent1] 

所以,我在這裏沒有看到任何連接從城市或產品加載數據。 其結果是空: enter image description here

我嘗試了不同的映射選項,如:HasOptional,WithRequiredPrincipal,試圖客戶廣告載體添加到市(雖然這是不正確的,城市沒有了解一下客戶) 沒有幫助。輔助實體始終爲空。 我錯在哪裏?

回答

1

問題是你沒有包括相關的對象。使用Include嘗試這樣的事情:

var list = context.CustomerWithFk 
        .Include("City") 
        .Include("Product"); 

這告訴你要拉回顧客城市和產品一起實體框架。如果您有興趣,請參閱以下文章:http://msdn.microsoft.com/en-us/data/jj574232.aspx

編輯:您還可以使延遲加載(根據您的意見,我相信這是你所追求的)加入該對上下文:

context.ContextOptions.LazyLoadingEnabled = true; 

瞭解更多關於延遲加載這裏:http://msdn.microsoft.com/en-us/library/vstudio/dd456846(v=vs.100).aspx

+0

謝謝。但是有什麼辦法不使用像Include這樣的顯式命令並且在後臺使用FK?我確信,昨天,在一些映射實驗中,我用正確的結果填充了屬性而不用調用Include。 它看起來像我非常接近解決方案,但盲目,看不到我的錯誤... – 2014-12-13 18:59:52

+1

請參閱編輯。我相信你正在尋找懶加載。 – Dean 2014-12-13 20:05:11

相關問題