2012-08-15 108 views
1

我有一個單一的位置表,其中有多個外鍵關係。它具有狀態表,城市表,國家表和用戶表的外鍵。現在我已經在Entity框架中正確映射了表模型,但是如果我嘗試訪問位置表中的外鍵ID字段以添加新的外鍵映射,我無法訪問它,取而代之的是我得到一個引用字段,例如StateReference實體框架維護外鍵關係

現在我發現一些文章說,只使用entitykey.StateReference。我嘗試過,它的工作原理,但對我來說似乎很笨重。我注意到的是它也提供了一個現場狀態,而不是StateID。所以,我假設一個人可以將狀態名稱傳遞給Location對象,而實體框架幾乎可以自動將關係映射出來。我無法在任何地方查找或找出正確的語法。

如果我在這裏偏離基地,有人請指出正確的方向並糾正我?我一直在衝這一段時間,似乎無法得到它。或者如果我說的是正確的,有人可以給我一些基本的代碼來顯示語法。我正在VS2010中創建一個Web服務,所以如果我理解正確,我正在使用ef v1。以下是我的位置對象的代碼。

using(Entities context = new Entities()) 
    { 
     Location NewLocation = new Location 
     { 
      //In SQL all three of these field are acutally foreign key ids I am 
      trying to maintian 
      State = context.States.Where(i => i.State1.Equals(AddedState)), 
      Country = context.Countries.Where(i => i.State1.Equals(AddedCountry)), 
      City = context.Cities.Where(i => i.City1.Equals(AddedCity)), 
     } 
     }; 
     context.AddToLocation(NewLocation); 
     context.SaveChanges(); 
    } 
+1

您需要在SO處閱讀一些有關編輯器的內容(單擊幫助,然後在問題編輯器中單擊高級幫助)。不要爲段落使用前導空格,這會將它們變成代碼塊。我編輯了它,但編輯需要一段時間才能完成審批流程。根據你的問題,我知道在EF 4.x中,我可以設置一個選項,告訴它映射外鍵以及創建引用。我不認爲這個選項在以前的版本中可用,所以你也可以指定你使用的是哪個EF版本。 – Tod 2012-08-15 17:34:52

回答

0

正確的語法應爲:

using(Entities context = new Entities()) 
{ 
    Location NewLocation = new Location 
    { 
     State = context.States.SingleOrDefault(s => s.ID == AddedState.ID), 
     Country = context.Countries.SingleOrDefault(c => c.ID == AddedCountry.ID), 
     City = context.Cities.SingleOrDefault(c => c.ID == AddedCity.ID) 
    }; 
    context.AddToLocation(NewLocation); 
    context.SaveChanges(); 
} 

(假設該主鍵的屬性稱爲ID

BTW:使用VS2010並不一定意味着你使用的是EF版本1 。重要的是您的項目的.NET Framework目標平臺:如果項目的目標是.NET 3.5,則使用EF版本1.如果項目的目標是.NET 4.0,則使用EF版本4.(版本2和3不存在)創建時的默認目標平臺VS2010中的一個新項目是.NET 4.0。因此,除非您明確將目標平臺更改爲.NET 3.5(或將VS2008的舊項目遷移至VS2010),否則使用EF 4.0的可能性更大。

正如Tod在您的問題下面的註釋中提到的那樣,在EF 4.0中,您可以選擇在從現有數據庫架構創建/更新模型時將外鍵列公開爲模型屬性。在更新嚮導是一個複選框「在模型中包含外鍵列」:

Update Wizard

編輯

如果AddedStateAddedCountryAddedCity是代表的Name屬性字符串這些實體,你可以用ID替換查詢Name

using(Entities context = new Entities()) 
{ 
    Location NewLocation = new Location 
    { 
     State = context.States.SingleOrDefault(s => s.Name == AddedState), 
     Country = context.Countries.SingleOrDefault(c => c.Name == AddedCountry), 
     City = context.Cities.SingleOrDefault(c => c.Name == AddedCity) 
    }; 
    context.AddToLocation(NewLocation); 
    context.SaveChanges(); 
} 

請注意,使用SingleOrDefault假定Name在數據庫表中是唯一的。如果有兩個或更多記錄同名SingleOrDefault將引發異常(「序列包含多個元素」)。您可以用FirstOrDefault替換SingleOrDefault,然後只加載具有給定名稱的第一條記錄。

+0

我想我不會遵循,因爲AddedState是要添加到數據庫中的狀態字符串。所以這意味着我必須去檢索添加狀態的ID,然後使用我的單一或默認值,然後再次返回到表並檢索ID以將其設置爲我的位置表中的狀態外鍵ID?如果我正確理解這個看起來超級冗餘。我想我很想在這裏解釋一些事情,所以如果你可以請再解釋一下。此外,我正在使用v 3.5,所以EF 1. – AndrewBrntt 2012-08-16 18:37:02

+0

@ user1474882:不,您不需要加載該ID。您需要通過任何查詢加載實體本身。這並不需要通過ID進行查詢,只需使用名稱查詢即可。看到我上面的編輯部分。 – Slauma 2012-08-16 19:47:42