2014-04-16 41 views
0

實體框架一個可選的外鍵碼第一流利的映射

User 
    ------ 
    UserId PK 


    Access 
    ------- 
    AccessId PK 
    UserId FK to User.UserId 

用戶實體

public int Id { get; set; } 
public virtual Access Access { get; set; } 

訪問實體

public int Id { get; set; } 
public int UserId { get; set; } 
public virtual User User { get; set; } 

訪問映射

... 
HasKey(t => t.Id); 
Property(t => t.Id).HasColumnName("AccessId"); 
HasRequired(t => t.User).WithOptional(t => t.Access); 
... 

用戶映射

... 
HasKey(t => t.Id); 
Property(t => t.Id).HasColumnName("UserId"); 
... 

查詢

var access = _unitOfWork.Users.Get() 
       .Where(u => u.Id == userId) 
       .Select(u => u.Access) 
       .FirstOrDefault(); 

生成的SQL

LEFT OUTER JOIN [dbo].[Access] AS [Extent2] 
    ON [Extent1].[UserId] = [Extent2].[AccessId] <-- ** PROBLEM IS HERE ** 

我的查詢嘗試加入錯誤的列,儘管我在數據庫中設置了PK/FK,並在我的實體映射中指定了PK。任何人都可以發現我錯過的東西嗎?謝謝。

回答

4

在EF中映射1..0或1的關係時,預計其依賴關係的主鍵是主體的外鍵。

對您而言,這意味着您的Access實體應放棄AccessId主鍵,並使UserId成爲您的關鍵。

如果你不能改變你的模式以允許這樣做,你最好的解決方法就是將關係變成1..many並在你的代碼中欺騙它。

+0

非常感謝你,我真的被困在這。 – fearofawhackplanet