2013-01-24 47 views
0

我有這樣更新列表<T>中的DbContext

public class Challenge 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Blurb { get; set; } 
    public int Points { get; set; } 
    public string Category { get; set; } 
    public string Flag { get; set; } 
    public List<string> SolvedBy { get; set; } 
} 

public class ChallengeDBContext : DbContext 
{ 
    public DbSet<Challenge> Challenges { get; set; } 
} 

,然後控制器這樣一個模型。但是我不能更新列表「SolvedBy」,下一次我用調試器逐步完成時,列表仍然是空的。

[HttpPost] 
    public string Index(string flag = "", int id=0) 
    { 
     Challenge challenge = db.Challenges.Find(id); 
     if (flag == challenge.Flag) 
     { 
      var chall = db.Challenges.Find(id); 
      if (chall.SolvedBy == null) 
      { 
       chall.SolvedBy = new List<string>(); 
      } 
      chall.SolvedBy.Add(User.Identity.Name); 
      db.Entry(chall).State = EntityState.Modified; 
      db.SaveChanges(); 
      //congrats, you solved the puzzle 
      return "got it"; 
     } 
     else 
     { 
      return "fail"; 
     } 
    } 

有沒有辦法繞過它來保存在數據庫中的字符串列表?

回答

1

EF不知道如何在數據庫表中存儲數組,因此它只是忽略它。您可以創建另一個表/實體或使用XML/JSON來存儲列表。你可以在保存之前序列化列表,然後在從數據庫加載後將其反序列化。

+0

最終這樣做。 xml序列化的字符串效果很好! –

1

在模型中的A List<T>通常會映射到第二個表格,但在您的DbContext中只有一個表格。嘗試添加第二個表格。

public class ChallengeDBContext : DbContext 
{ 
    public DbSet<Challenge> Challenges { get; set; } 
    public DbSet<Solution> Solutions {get; set;} 
} 

public class Challenge 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Blurb { get; set; } 
    public int Points { get; set; } 
    public string Category { get; set; } 
    public string Flag { get; set; } 
    public List<Solution> SolvedBy { get; set; } 
} 

public class Solution 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

然後控制器可以使用代碼沿線的...

 var chall = db.Challenges.Find(id); 
     if (chall.SolvedBy == null) 
     { 
      chall.SolvedBy = new List<Solution>(); 
     } 
     chall.SolvedBy.Add(new Solution {Name=User.Identity.Name}); 

以上都不經測試,我可能已經有犯了一些錯誤,但總的原則我想說明你需要另一張桌子。 List<T>表示SQL中的JOIN。

+0

之後,SolvedBy成員在更新後仍不爲空。 –

+0

@Jeff你應該實例化'this.SolvedBy = new List ();'在你的'Challenge'構造函數 – 2013-01-24 03:31:53

+0

@bmewsing中,嘗試了兩種方法。 –