gpt4 book ai didi

asp.net-mvc - 使用 EF Code First 和 ASP.NET MVC 部分更新对象

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

EF4.1-Code-First-Gurus!

我想知道是否有更优雅的方法来处理以下 ASP.NET MVC 3 EF 4.1 Code First 场景:假设我们有以下 POCO:

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

[ScaffoldColumn(false)]
public DateTime CreatedOn { get; set; }

[ScaffoldColumn(false)]
public DateTime ModifiedOn { get; set; }
}


public class Person : Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime Birthday { get; set; }
}

假设我们已经创建了一些标准编辑 View ,其中不包括 CreatedOn/ModifiedOn 字段,因为它们将在存储库中设置而不是由用户设置。

在我的存储库中,我有以下 Update 方法。这些方法除了应该更新的字段列表(留下 CreatedOn/ModifiedOn 字段):
    public void Update(Person person, List<string> properties)
{
Person tmpPerson = context.People.Single(x => x.Id == person.Id);
context.People.Attach(tmpPerson);

foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(person))
{
if (properties.Contains(descriptor.Name))
descriptor.SetValue(tmpPerson, descriptor.GetValue(person));
}

tmpPerson.ModifiedOn = DateTime.Now;
}

现在 Controller 像这样调用这个方法:
    [HttpPost]
public ActionResult Edit(Person person)
{
if (ModelState.IsValid) {

personRepository.Update(person, new List<string> { "FirstName", "LastName", "Birthday"});

personRepository.Save();
return RedirectToAction("Index");
} else {
return View();
}
}

这一切都像一个魅力。但是,我真的不喜欢,我必须手动指定字段。你会如何处理这个要求?当然,我可以将 CreatedOn/ModifiedOn 字段作为隐藏字段添加到 View 中,但我不想将表单加载太多(还有更多字段)。

也许这是一个类似的问题:
How To Update EF 4 Entity In ASP.NET MVC 3?

我非常感谢您的帮助!
约里斯

最佳答案

是的,还有更优雅的版本:

public void Update(Person person, params Expression<Func<Person,object>>[] properties)
{
context.People.Attach(person);

DbEntityEntry<Person> entry = context.Entry(person);

foreach (var property in properties)
{
entry.Property(property).IsModified = true;
}

person.ModifiedOn = DateTime.Now;
}

您将以这种方式调用该方法:
[HttpPost]
public ActionResult Edit(Person person)
{
if (ModelState.IsValid)
{

personRepository.Update(person, p => p.FirstName,
p => p.LastName, p => p.Birthday);
personRepository.Save();
return RedirectToAction("Index");
}
else
{
return View(person);
}
}

关于asp.net-mvc - 使用 EF Code First 和 ASP.NET MVC 部分更新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5862108/

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