2014-01-27 41 views
0

我正在嘗試執行左外部連接。它似乎工作正常,但我的朋友表爲空時出現問題。左外部連接實體框架獲取錯誤無法創建空常量

例如Users表具有與Table Friends(id)列相關的外鍵(friendId)。

雖然有時我的用戶將不與朋友聯繫,所以我得到這個錯誤: 無法創建類型的空恆定值「PandaBrew.Models.FriendModel」

如何處理呢?

回購代碼:

var authUser = (from u in db.Users 
         join f in db.Friends on u.FriendId equals f.Id into jointable 
         from j in jointable.DefaultIfEmpty() 
         where u.EmailAddress == user.EmailAddress 
         select new UserModel 
         { 
          Id = u.Id, 
          CreatedOn = u.CreatedOn, 
          EmailAddress = u.EmailAddress, 
          FriendId = u.FriendId, 
          RoleId = u.RoleId, 
          PasswordHash = u.PasswordHash, 
          Friend = u.FriendId != null ? new FriendModel() 
            { 
             Alias = j.Alias, 
             CarrierId = j.Id, 
             CreatedOn = j.CreatedOn, 
             FirstName = j.FirstName, 
             Id = j.Id, 
             LastName = j.LastName, 
             Locked = j.Locked, 
             PhoneNumber = j.PhoneNumber, 
             SteamId = j.SteamId, 
            } : null, 
         }).SingleOrDefault(); 

我想朋友設置爲空時,有沒有friendId,但它無法正常工作。

+0

我通常解決此問題,通過(在這種情況下)創建一個空的FriendModel而不是零和然後檢查(並可能將Friend設置爲null)。這不是你的代碼的問題,這是EF的問題。 – Mark

+0

嗯,你能告訴我你的意思嗎?因爲當我將它設置爲空時,我仍然收到錯誤。 – allencoded

+0

它是最簡單的形式,我的意思是:Friend = u.FriendId!= null?新的FriendModel(){...}:new FriendModel(),然後執行類似「if(authUser.Friend.Id == 0)authUser.Friend = null」的操作。 – Mark

回答

1

所以在對源代碼控制和內存進行一些挖掘之後,我回憶起我的第一個評論是我嘗試的第一件事,那就是沒有最終的工作。最後,我決定拆分查詢(刪除連接),然後檢查是否需要第二個查詢來獲取相關數據。我首先將所有內容選擇爲匿名類型,然後根據需要填寫實際的類,但再次查看它我認爲在您的案例中有一個更簡單的更簡潔的方法(請參見下文)。

var authData = (from u in db.Users 
       where u.EmailAddress == user.EmailAddress 
       select new 
       { 
        Id = u.Id, 
        CreatedOn = u.CreatedOn, 
        EmailAddress = u.EmailAddress, 
        FriendId = u.FriendId, 
        RoleId = u.RoleId, 
        PasswordHash = u.PasswordHash, 
        FriendId = u.FriendId 
       }).SingleOrDefault(); 

var authUser = new UserModel() 
{ 
    Id = authData.Id, 
    CreatedOn = authData.CreatedOn, 
    EmailAddress = authData.EmailAddress, 
    FriendId = authData.FriendId, 
    RoleId = authData.RoleId, 
    PasswordHash = authData.PasswordHash 
}; 

if (authData.FriendId != null) 
{ 
    // Set authUser.Friend here with a new query 
} 

或者說,應該工作更清潔的方法是隻用ID來初始化朋友: