Доступ к БД из базовой модели
У меня есть базовая модель, как показано ниже, и я использую эту модель, чтобы получить / установить дату создания и изменения для каждой модели.
public class BaseModel
{
[ForeignKey("CrUser")]
public ApplicationUser UserCr { get; set; }
public string CrUser { get; set; }
public DateTime? MdDate { get; set; }
[ForeignKey("MdUser")]
public ApplicationUser UserMd { get; set; }
public void LogBasic()
{
if (this.CrDate == null)
{
this.CrDate = System.DateTime.Now;
this.CrUser = HttpContext.Current.User.Identity.GetUserId();
}
else
{
this.MdDate = System.DateTime.Now;
this.MdUser = HttpContext.Current.User.Identity.GetUserId();
}
}
}
При создании новой записи проблем нет, но при обновлении модели я не смог установить MdUser. Я знаю, причина в том, что CrUser и CrDate пустые, как вы можете видеть ниже метод, они не являются обязательными.
Вот мой метод редактирования
public ActionResult Edit([Bind(Include = "Id,Name,FullName,Address,TaxNumber,TaxOffice,Phone1,Phone2,Email,CompanyType")] CrmCompany crmcompany)
{
if (ModelState.IsValid)
{
crmcompany.LogBasic();
db.Entry(crmcompany).State = EntityState.Modified;
db.SaveChanges();
}
}
Чтобы решить проблему с моим путем, мне нужно передать CrDate и CrUser, или мне нужно получить из базы данных для каждого метода редактирования.
Как я могу решить эту проблему в моем методе LogBasic(). Если я смогу получить доступ к БД и получить метод Crdate и Cruser в методе LogBasic(), я легко смогу решить проблему, но любая модель может вызвать метод LogBasic().
1 ответ
Вам нужно будет получить CrDate и CrUser для создания модели или функцию LogBasic, несмотря ни на что. Если вы не обновите их, они будут обнулены, так как в модели не задано значение. Я бы рекомендовал хранить их как скрытые поля и связывать их как обычно. Таким образом, вам не нужно совершать две поездки в БД для обновления.
РЕДАКТИРОВАТЬ: Чтобы сделать это немного проще, вы можете добавить этот метод в свой класс BaseModel. Это выведет скрытые поля для привязки. Я сделал несколько предположений (например, все идентификаторы пользователей - это положительные целые числа).
public MvcHtmlString BaseModelHiddenFields()
{
StringBuilder outputString = new StringBuilder();
if(CrDate != null && CrDate.HasValue)
{
sb.AppendFormat("<input type=\"hidden\" name\="CrDate\" value=\"{0}\">", CrDate.Value);
}
if(CrUser > 0)
{
sb.AppendFormat("<input type=\"hidden\" name\="CrUser\" value=\"{0}\">", CrUser);
}
if(MdDate != null && MdDate.HasValue)
{
sb.AppendFormat("<input type=\"hidden\" name\="MdDate\" value=\"{0}\">", MdDate.Value);
}
if(MdUser > 0)
{
sb.AppendFormat("<input type=\"hidden\" name\="MdUser\" value=\"{0}\">", MdUser);
}
return MvcHtmlString.Create(sb.ToString());
}