在 DbContext 中更新列表
本文关键字:列表 更新 DbContext | 更新日期: 2023-09-27 17:55:27
我有一个这样的模型
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";
}
}
有没有办法制作保存在数据库中的字符串列表?
EF
不知道如何在数据库表中存储数组,因此它只是忽略它。您可以创建另一个表/实体或使用 XML/JSON 来存储列表。您可以在保存之前序列化列表,并在从数据库加载后反序列化列表
模型中的
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。