如何解决.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
项目或数据集时,我都会对其运行一个方法 - 例如,转为大写的
FirsTNAME
和LASTNAME
属性/字段或舍入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 举报,一经查实,本站将立刻删除。