2013-04-06 25 views
0

我面臨下一個問題。我有一個模型數據倉庫實體框架4.0與保存數據有關奇怪

public class GameResult 
    { 
     public int GameResultId { get; set; } 

     public virtual Competition Competition { get; set; } 
     public virtual CustomDate DateGame { get; set; }  
     public virtual Contender ContenderFirst { get; set; } 
     public virtual Contender ContenderSecond { get; set; } 
     public virtual Location Location { get; set; } 
} 



public class Competition 
    { 
     [Key] 
     public int CompetitionId { get; set; } 
     public string Name { get; set; } 

     //Lazy loading 
     public virtual KindSport KindSport { get; set; } 


    } 

類似的東西 我產生一些數據事實表GameResult

gameResult.Location = location; 
gameResult.Competition = competition; 
gameResult.ContenderFirst = firstContender; 
gameResult.ContenderSecond = secondContender; 

public void saveGameResult(GameResult gameResult) 
     { 
      using (var db = new GameContext()) 
      { 
       db.GameResults.Add(gameResult); 
       db.SaveChanges(); 
      } 

     } 

但是,當我嘗試保存的數據得到,我不救enity只是事實表他們得到級聯保存在子表中作爲Location, Contender

我該如何解決我的問題?

回答

1

Add將整個對象圖標記爲Added

這是解決它的方式:

public void saveGameResult(GameResult gameResult, .... more arguments ....) 
{ 
    using (var db = new GameContext()) 
    { 
     db.GameResults.Add(gameResult); 
     gameResult.Location = location; 
     gameResult.Competition = competition; 
     gameResult.ContenderFirst = firstContender; 
     gameResult.ContenderSecond = secondContender; 
     db.SaveChanges(); 
    } 
} 

但你必須增加更多的參數。

更繁瑣的辦法就是放下一切事情是這樣的,並標記每個維度UnChanged

db.GameResults.Add(gameResult); 
Entry(gameResult.Location).State = EntityState.Unchanged; 
... 

還有一種方法是隻設定了Id值:

gameResult.LocationId = location.LocationId; 
... etc. 

public void saveGameResult(GameResult gameResult) 
{ 
    ... (original code) 

但隨後當然,原始的Id屬性應該是他事實類的一部分,形成foreign key assocations

+0

在第一種情況下,我得到'Microsoft.Office.Tools.Common.Implementation.dll中出現'System.Reflection.TargetInvocationException'類型的第一次機會異常' – Ray 2013-04-07 10:08:11

+0

,這只是一個想法。我無法控制'Microsoft.Office'的依賴關係。 – 2013-04-07 11:11:00

1

您必須從數據庫加載實體位置和競爭者。否則,他們將被插入它。

+0

我應該生成子實體,例如'Location location = locations [random.Next(countLocations)];' – Ray 2013-04-06 21:08:37

+0

什麼是位置? – tschmit007 2013-04-06 21:14:54

+0

'List locations = selectLocations(); int countLocations = locations.Count();'從db中選擇 – Ray 2013-04-06 21:15:57