gpt4 book ai didi

c# - 如何指示 Entity Framework 不要更新模型的属性

转载 作者:行者123 更新时间:2023-11-30 17:15:49 25 4
gpt4 key购买 nike

我正在使用 Asp.net MVC 和 Entity 框架(以下代码仅用于演示)

我有一个像下面这样的模型

  public class Person
{
[Key]
public int Id { get; set; }

[Required]
public string FirstName { get; set; }

/*Time at which person was created*/
public DateTime CreatedOn { get; set; } /*should not change once created*/
}

在创建+插入新人时,我手动设置了 CreatedOn 日期时间属性。

更新时

我的 View 只有一个文本框

 @using (Html.BeginForm())
{
@Html.LabelFor(a => a.FirstName)
@Html.EditorFor(a => a.FirstName)
@Html.ValidationMessageFor(a => a.FirstName)
<br />
<input type="submit" name="name" value="submit" />
}

Controller

    [HttpPost]
public ActionResult EditPerson(Person person)
{
if (ModelState.IsValid)
{
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();

/* ----------------
Error here
-----------------
*/

return RedirectToAction("ListPerson");
}
return View(person);
}

我在我的代码中提到的地方遇到错误,错误:将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。 错误看起来很明显 person Controller 内部接收到的对象具有默认时间值, Entity Framework 也尝试更新该字段。

我的问题是如何指示 Entity Framework 不更新属性。假设在上述情况下,如果对于 CreatedOn 属性,我对 Entity Framework 说不要更新它,我就不会出错。

我在 CreatedOn 上尝试了 [Editable(false)] 属性,但没有成功。

有一些选项,例如,在更新之前,我首先从数据库加载现有实体并复制 createdOn 属性......

我想让你知道,在我的真实模型中,有很多我不想更新的属性,而且有很多这样的模型,所以我期待一些现实的答案。

编辑1

我先使用代码。

最佳答案

您收到的特定错误是因为 CreatedOn 被设置为默认值。当您执行回发时,您必须从数据库加载对象,更新它然后保存它。通过这样做,您将停止遇到的这个特定错误。

看来您正在使用实体模型作为 Controller 中的模型。我不推荐这个。通过专门为帖子创建模型,您可以从模型中删除任何不可编辑的字段。然后,您会将模型值从 ViewModel 复制到您的实体模型。这可以防止用户编辑您可能不希望他们编辑的属性。

public class PersonViewModel
{
[Key]
public int Id { get; set; }

[Required]
public string FirstName { get; set; }
}

这是一个好主意的主要原因是有人可能会尝试猜测哪些值也可能有效。例如,如果您的 Person 对象上有一个名为 IsAdministrator 的属性,我要拦截该帖子并添加 &IsAdministrator=on&Adminstrator=on&Admin=on(覆盖一些基础)然后 ModelBinder 将采用该值并将其应用于模型。现在我刚刚成为您系统的管理员。我意识到如果您有很多模型,这将是很多工作,但将实体模型用于帖子绝不是一个好主意。

您还可以使用 Bind 属性来限制映射器绑定(bind)的项目。

public ActionResult EditPerson([Bind(Exclude = "CreatedOn")] Person person)

这应该可以防止 Binder 绑定(bind)该特定属性。但是,它不会解决您的问题,因为创建人员对象时始终设置默认值。解决此问题的唯一方法是从数据库加载对象,然后更新/保存它。

关于c# - 如何指示 Entity Framework 不要更新模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757941/

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