gpt4 book ai didi

entity-framework - 如何使用 EF 更新 Controller 中的对象?

转载 作者:行者123 更新时间:2023-12-04 07:22:05 25 4
gpt4 key购买 nike

我在谷歌上搜索过,但似乎太明显了,没有人在谈论这个。

我的表有一个存储库,我希望能够更新我的数据库。

在 Linq2Sql 上,你有类似的东西:

public void SaveCar(Car car)
{
if (carTable.GetOriginalEntityState(car) == null)
{
carTable.Attach(product);
carTable.Context.Refresh(RefreshMode.KeepCurrentValues, car);
}
carTable.ContextSubmitChanges();
}

在 Controller 中,只需在 POST Edit 方法上调用此方法。

我如何在 EF 中做这样的事情?更好的办法。

我看到使用 TryUpdateModel(model) 的代码,但我不确定是否更新了我在数据库上的内容,或者我必须先选择对象并使用 FormCollection 更新它...

我很困惑,我只需要从表单中获取一辆汽车并使用数据库中的相同 ID 更新汽车。那么,我必须在 Controller 和存储库中做什么?

谢谢你。

编辑:如果我不清楚,我真的不知道我放在那里是否需要转换为 EF。我只想知道如何使用 EF 更新对象的实例(我使用的是 EFCodeFirst)。我如何从表单接收实例并在数据库中更新它。

最佳答案

TryUpdateModel方法可用于为对象分配值,使用它的属性名称和 web 请求中指定的值之间的映射。话虽如此,您可以通过执行以下操作来实现相同的行为:

[HttpPost]
public ActionResult Edit(int id, FormCollection form)
{
Car entity = new Car { Id = id };

// This will attach the car entity to the content in the unchanged state.
this.EntityFrameworkObjectContext.Cars.Attach(car);

TryUpdateModel(entity, form.ValueProvider.ToXYZ()); // Can't remember the exact method signature right now

this.EntityFrameworkObjectContext.SaveChanges();
...
}

将实体附加到上下文时,您基本上只是通知上下文您有一个实体,他应该照顾它。附加实体后,上下文将跟踪对其所做的更改。

但是此方法仅适用于标量属性,因为使用此方法不会更新导航属性。如果您启用了外键属性(例如分配给 Category 的 Product 也有一个 CategoryId 属性,它将两者联系起来),您应该仍然可以使用此方法(因为导航属性是使用标量属性映射的)。

编辑:另一种方法是接受一个 Car 实例作为参数:
[HttpPost]
public ActionResult Edit(int id, Car car)
{
Car entity = new Car { Id = id };

// This will attach the car entity to the content in the unchanged state.
this.EntityFrameworkObjectContext.Cars.Attach(entity);

// It is important that the Car instance provided in the car parameter has the
// the correct ID set. Since the ApplyCurrentValues will look for any Car in the
// context that has the specified primary key of the entity supplied to the ApplyCurrentValues
// method and apply it's values to those entity instance with the same ID (this
// includes the previously attached entity).
this.EntityFrameworkObjectContext.Cars.ApplyCurrentValues(car);
this.EntityFrameworkObjectContext.SaveChanges();
...
}

您还可以滚动自己的 ModelBinder,它实际上引用了您的 Entity Framework 上下文,并查看是否在表单/查询中指定了 Car.Id。如果存在 ID,您可以直接从上下文中获取要更新的实体。此方法需要一些努力,因为您必须确保首先搜索 ID,然后应用所有指定的属性值。如果你有兴趣,我可以给你一些例子。

关于entity-framework - 如何使用 EF 更新 Controller 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5136909/

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