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>は通常、2番目のテーブルにマップされますが、モデル内にはDbContext1つのテーブルしかありません。2番目のテーブルを追加してみてください。

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 に答える