#c# #.net #entity-framework-6
Вопрос:
Я настраиваю старое веб-приложение, построенное на ASP.NET MVC 5, .NET 4.6, Entity Framework 6.
Я использовал Entity Framework, чтобы построить его с использованием подхода, основанного на базе данных. Я не использовал уровень DDD / Репозитория / сервисов (это простая архитектура).
Мне нужно это сделать:
- Я не хочу массово обновлять записи базы данных
- Каждый раз, когда я создаю/редактирую/перечисляю
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);
}
}
}
Я читал, что можно расширить Entity Framework, добавив некоторые методы расширения. Если это возможно, я могу написать что-то вроде этого:
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);;
}
Пожалуйста, кто-нибудь может мне помочь в этом?
Можно ли расширить Entity Framework, как описано выше?
Спасибо всем
Комментарии:
1. Прописные буквы имени и фамилии могут быть очень легко выполнены в методе настройки этих свойств — методы расширения не требуются …
Ответ №1:
Что ж, ты почти сделал это. Сначала определите статический класс для расширений контекста и добавьте свой новый пользовательский метод расширения
public static class AppIdentityDbContextExtensions()
{
public static bool AddSomething(this AppIdentityDbContext appIdentityDbContext )
{
<your-code-here>
};
}
А затем вызовите новый метод расширения следующим образом
return new AppIdentityDbContex().AddSomething();