Я использую код первый подход. У меня есть два класса как следующие:
public class User
{
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int User_id { get; set; }
[Required]
[Column(Order = 1)]
[StringLength(50)]
[Display(Name = "Name")]
public string name { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode =true,DataFormatString ="{0:dd/MM/yyyy}")]
public DateTime? date_of_birth { get; set; }
[Required]
[Column(Order = 3)]
[StringLength(254)]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
public string email { get; set; }
public virtual ICollection<Product> products { get; set; }
}
public class Product
{
[Key]
[Required]
public int product_id { get; set; }
public int UserId { get; set; }
public virtual User user { get; set; }
[Required]
public string title { get; set; }
[Required]
public int type { get; set; }
[DataType(DataType.Date)]
public DateTime date_of_release { get; set; }
[Required]
public float price { get; set; }
}
Я пытаюсь добавить новый продукт и связать его с зарегистрированным пользователем.
Это моя модель представления:
public class AddProductViewModel
{
[Required]
public string title { get; set; }
[Required]
public int type { get; set; }
[DataType(DataType.Date)]
public DateTime date_of_release { get; set; }
[Required]
public float price { get; set; }
}
Я не мог понять, как установить значение userId, который является идентификатором пользователя, вошедшего в систему, поэтому я в итоге запросил его из базы данных. и установив его следующим образом:
[HttpPost]
public ActionResult AddProduct(AddProductViewModel added)
{
if(ModelState.IsValid)
{
using (KitapTakasDB db = new KitapTakasDB())
{
string user_email = User.Identity.GetUserName();
Product product = new Product();
product.title = added.title;
product.price = added.price;
product.type = added.type ;
product.userId = db.User.Where(o => o.email ==
user_email).FirstOrDefault().user_id;
db.Product.Add(product);
db.SaveChanges(); //this is where the crash happens...
}
return RedirectToAction("Index", "Home");
}
return View();
}
При отправке формы я получаю исключение в строке db.SaveChanges()
.
DbUpdateException: 'Произошла ошибка при обновлении записей. Подробности см. Во внутреннем исключении. '
Внутреннее исключение:
Преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона
Я проверил нулевое значение DateTime, но они не были нулевыми.
Как правильно установить внешний ключ при добавлении новой записи в базу данных? И если мой подход правильный (я сомневаюсь в этом), как я могу исправить эту ошибку?
Спасибо