加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 06:29:16 所属栏目:asp.Net 来源:网络整理
导读:EF4.1码 – 首先,大师! 我想知道是否有一种更优雅的方式来处理以下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; }
EF4.1码 – 首先,大师!

我想知道是否有一种更优雅的方式来处理以下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; }
}

让我们假设我们已经创建了一些标准的编辑视图,这些视图不包括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;
    }

现在控制器正在调用此方法,如下所示:

[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字段作为隐藏字段添加到视图中,但我不想将表单加载到更多(还有更多字段).

也许这是一个类似的问题:
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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读