0

我有一个这样的模型

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";
        }
    }

有什么办法可以制作一个保存在数据库中的字符串列表?

4

2 回答 2

1

模型中的AList<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});

以上都没有经过测试,我可能在那里犯了一些错误,但我想说明的一般原则是你需要另一个表。代表 SQL 中的List<T>JOIN。

于 2013-01-24T03:20:59.980 回答
1

EF 不知道如何在数据库表中存储数组,所以它只是忽略它。您可以创建另一个表/实体或使用 XML/JSON 来存储列表。您可以在保存之前序列化列表,并在从数据库加载后反序列化它

于 2013-01-24T03:26:06.177 回答