gpt4 book ai didi

c# - 如何在 ASP.NET MVC5 中的后操作中更新实体内的集合?

转载 作者:太空狗 更新时间:2023-10-29 23:38:01 25 4
gpt4 key购买 nike

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

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

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

这是表格: Edit form

这是更新实体的操作:

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 框架)背景。我认为这会更容易,但我一直遇到问题。

最佳答案

基本上我缺少 Attach 函数,我必须强制加载集合才能使其正常工作。

我在这里找到了如何附加一个非附加实体:Model binding in the controller when form is posted - navigation properties are not loaded automatically

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

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

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

关于c# - 如何在 ASP.NET MVC5 中的后操作中更新实体内的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31951185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com