Доступ к БД из базовой модели

У меня есть базовая модель, как показано ниже, и я использую эту модель, чтобы получить / установить дату создания и изменения для каждой модели.

 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());
}
Другие вопросы по тегам