繁体   English   中英

如何在ASP.NET MVC5中的post操作中更新实体内的集合?

[英]How to update a collection inside an entity within a post action in ASP.NET MVC5?

我创建了一个ASP.NET MVC5示例项目。 我创建了我的实体,并从中为脚手架控制器进行CRUD操作。 我只能使用脚手架代码编辑POD成员。 我希望能够添加/删除相关实体。

使用我当前的代码,当我单击保存时没有错误但没有修改相关实体(虽然修改了POD数据)。 例如,如果我想从帐户中删除所有玩家,则不会将其删除。 我究竟做错了什么?

如何删除/添加相关实体并将这些更改推送到数据库?

这是表格: 编辑表格

以下是更新实体的操作:

public async Task<ActionResult> Edit([Bind(Include = "Account,Account.AccountModelId,Account.Name,Account.CreatedDate,SelectedPlayers")] AccountViewModel_Form vm){
    if (ModelState.IsValid){
        if (vm.SelectedPlayers != null){
            vm.Account.PlayerModels = db.PlayerModels.Where(p => p.AccountModel.AccountModelId == vm.Account.AccountModelId).ToList();
            foreach (var player in vm.Account.PlayerModels){
                player.AccountModel = null;
                db.Entry(player).State = EntityState.Modified;
            }
            vm.Account.PlayerModels.Clear();
            foreach (var player_id in vm.SelectedPlayers){
                var player = db.PlayerModels.Where(p => p.PlayerModelId == player_id).First();
                vm.Account.PlayerModels.Add(player);
                db.Entry(player).State = EntityState.Modified;
            }
        }
        db.Entry(vm.Account).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(vm);
}

以下是模型:

public class AccountViewModel_Form{
    public AccountModel Account { get; set; }
    public HashSet<Int32> SelectedPlayers { get; set; }
    public virtual List<PlayerModel> PlayersList { get; set; }
}
public class AccountModel{
    public AccountModel(){
        PlayerModels = new HashSet<PlayerModel>();
    }
    public Int32 AccountModelId { get; set; }
    public string Name { get; set; }
    public DateTime CreatedDate { get; set; }
    public virtual ICollection<PlayerModel> PlayerModels { get; set; }
}
public class PlayerModel{
    public Int32 PlayerModelId { get; set; }
    public float Gold { get; set; }
    public string Name { get; set; }
    public virtual AccountModel AccountModel { get; set; }
}

我基本上迷路了。 我找不到任何更新相关数据的例子。 有人能指出我正确的方向吗?

我来自Symfony(PHP Framework)背景。 我觉得这会更容易,但我遇到了问题。

基本上我错过了Attach函数,我不得不强制集合上的负载使它工作。

我在这里找到了如何附加非附加实体: 在发布表单时在控制器中进行模型绑定 - 不会自动加载导航属性

发布数据时,实体未附加到上下文,当您尝试将更改保存到复杂实体时,上下文会变得混乱。

代码有点不同,因为我试图让它在家里工作。 但它基本上是相同的模型。

    public ActionResult Edit(AccountEditViewModel vm)
    {
        if (ModelState.IsValid)
        {
            //I was missing these 2 important lines...
            db.Accounts.Attach(vm.Account);
            db.Entry(vm.Account).Collection(a => a.Players).Load();

            if (vm.SelectedPlayers != null)
            {
                foreach (var player in vm.Account.Players.ToList())
                {
                    if (vm.SelectedPlayers.Contains(player.Id) == false)
                    {
                        player.Account = null;
                        vm.Account.Players.Remove(player);
                        db.Entry(player).State = EntityState.Modified;
                        vm.SelectedPlayers.Remove(player.Id);
                    }
                }

                foreach (var player_id in vm.SelectedPlayers)
                {
                    var player = db.Players.Where(p => p.Id == player_id).First();
                    player.Account = vm.Account;
                    vm.Account.Players.Add(player);
                    db.Entry(player).State = EntityState.Modified;
                }
            }else
            {
                vm.Account.Players.Clear();
            }

            db.Entry(vm.Account).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(vm);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM