【问题标题】:How to set value of foreign key when inserting data into database in Asp.Net MVC在 Asp.Net MVC 中将数据插入数据库时​​如何设置外键值
【发布时间】:2020-02-22 07:01:39
【问题描述】:

我使用的是代码优先方法。我有两个类如下:

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; }
}

我不知道如何设置作为登录用户 ID 的 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 数据类型导致值超出范围

我检查了 null DateTime 但它们不是 null。

向数据库添加新条目时设置外键的正确方法是什么?如果我的方法是正确的(我对此表示怀疑),我该如何解决这个错误?

谢谢

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework model-view-controller


    【解决方案1】:

    您似乎忘记在此处添加日期。检查它是否不可为空或添加日期:

    Product product = new Product();
    product.title = added.title;
    product.price = added.price;
    product.type = added.type ;
    
    product.date_of_release = added.date;
    

    【讨论】:

      【解决方案2】:

      如果您已经验证日期不为空并且这不是问题,那么您可能传递的日期超出了SqlDateTime.MinValue()SqlDateTime.MaxValue() 之间的界限。

      SQL DateMin:(1753 年 1 月 1 日)

      SQL DateMax:(9999 年 12 月 31 日)

      【讨论】:

      • 我检查了我的用户表并调试了 viewmodel 参数,它们都是有效日期。我在数据库中将 DateTime 设为可为空,所以即使它为空,为什么它会出现问题?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2017-08-12
      • 2013-11-21
      • 1970-01-01
      • 2017-05-28
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多