微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET Framework 4 上 ASP.NET MVC 5 中实体框架 6 的扩展方法

如何解决.NET Framework 4 上 ASP.NET MVC 5 中实体框架 6 的扩展方法

我正在定制一个基于 ASP.NET MVC 5、.NET 4.6、Entity Framework 6 的旧 Web 应用程序。

我使用 Entity Framework 以数据库优先的方式构建它。我没有使用过 DDD / Repository / Services 层(这是一个简单的架构)。

我需要这样做:

  • 我不想大量更新数据库记录
  • 每次我创建/编辑/列出一个 PERSON_ENTITY 项目或数据集时,我都会对其运行一个方法
  • 例如,转为大写的 FirsTNAMELASTNAME 属性/字段或舍入 DAYS_FROM_LAST_LOGIN
  • 我不希望在 PERSON_ENTITY 控制器的创建/编辑/列表操作中出现重复代码
namespace Webapplication4.Controllers
{
    [Authorize]
    public class PersonsController : Controller
    {
        private CS_Webapplication4_Entities db = new CS_Webapplication4_Entities();
 
        public ActionResult Index()
        {
            var myDataset = db.PERSON_ENTITY ;
            
            //----------------------------------** 1° point **
            foreach(PERSON_ENTITY myPerson in myDataset)
            {
                myPerson.Firstname = Utils.Upperize(myPerson.Firstname);
                myPerson.Lastname = Utils.Upperize(myPerson.Lastname);
            }

            return View(myDataset.ToList());
        }
 
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            PERSON_ENTITY myPerson = db.PERSON_ENTITY.Find(id);

            if (myPerson == null)
            {
                return HttpNotFound();
            }

            ////---------------------------------- 2° point
            myPerson.Firstname = Utils.Upperize(myPerson.Firstname);
            myPerson.Lastname = Utils.Upperize(myPerson.Lastname);

            return View(myPerson);
        }
        
        public ActionResult Create()
        {
            //...
            return View();
        }
         
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "...")] PERSON_ENTITY myPerson)
        {
            if (ModelState.IsValid)
            {
                //3° point
                myPerson.Firstname = Utils.Upperize(myPerson.Firstname);
                myPerson.Lastname = Utils.Upperize(myPerson.Lastname);

                db.PERSON_ENTITY.Add(myPerson);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            //...
            return View(myPerson);
        }
         
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            PERSON_ENTITY myPerson = db.PERSON_ENTITY.Find(id);

            if (myPerson == null)
            {
                return HttpNotFound();
            }

            //...
            //4° point
            myPerson.Firstname = Utils.Upperize(myPerson.Firstname);
            myPerson.Lastname = Utils.Upperize(myPerson.Lastname);

            return View(myPerson);
        }
         
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "...")] PERSON_ENTITY myPerson)
        {
            //5° point
            myPerson.Firstname = Utils.Upperize(myPerson.Firstname);
            myPerson.Lastname = Utils.Upperize(myPerson.Lastname);

            if (ModelState.IsValid)
            {
                db.Entry(myPerson).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            //...
            
            return View(myPerson);
        }
    }
}

我读到可以通过添加一些扩展方法来扩展实体框架。如果可能的话,我可以这样写:

public static AppIdentityDbContext MyExtension()  
{
    var MyCustomizedMethod = new SOMETHING() {
                    if EntityType.Equals(PERSON_ENTITY)
                    {
                        PERSON_ENTITY.Firstname = Utils.Upperize(myPerson.Firstname);
                        PERSON_ENTITY.Lastname = Utils.Upperize(myPerson.Lastname);
                    }
                
    };

    return new AppIdentityDbContext().AddSomething(MyCustomizedMethod);;
}

请问,有人可以帮我做这件事吗?

是否可以按上述方式扩展实体框架?

谢谢大家

解决方法

好吧,您几乎已经完成了。首先为上下文的扩展定义一个静态类并添加新的自定义扩展方法

 public static class AppIdentityDbContextExtensions()  
 {
    public static bool AddSomething(this AppIdentityDbContext appIdentityDbContext )
    {
        <your-code-here>
    };
 }

然后像这样调用新的扩展方法

    return new AppIdentityDbContex().AddSomething();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。