尽管提供了值,但实体框架仍插入 null

Posted

技术标签:

【中文标题】尽管提供了值,但实体框架仍插入 null【英文标题】:Entity Framework inserting null despite providing value 【发布时间】:2021-02-08 16:50:57 【问题描述】:

我正在尝试使用实体框架将数据保存到 SQL Server 表中。我正在使用数据库优先方法。但是我不断收到user_id 为空的错误,但我已经在代码中分配了它:

无法将值 NULL 插入列“user_id”、表“dbo.Users”;列不允许空值。插入失败。 声明已终止。

这是我的代码:

    public ActionResult SaveUser(User user)
    
        using (DBEntities entities = new DBEntities())
        
            int maxUserId = entities.Users
                .Select(u => u.user_id)
                .DefaultIfEmpty(0)
                .Max();

            user.user_id = maxUserId + 1;

            entities.Users.Add(user);                
            entities.SaveChanges();

            return RedirectToAction("Index", "Users");
        
    

用户类:

public partial class User
  
    public int user_id  get; set; 
    public string username  get; set; 
    public Nullable<System.DateTime> Date_Captured  get; set;        

谢谢。

【问题讨论】:

即使这样可行,这也不是获取唯一 ID 的正确方法。如果多个请求大致同时到达,这是不安全的。在服务器端使用IDENTITY 列或显式SEQUENCE 【参考方案1】:

如果没有用户,user_id 将返回 null,因此无法插入新用户。这不是获取唯一 ID 的正确方法。查看@Jeroen Mostert 的评论

【讨论】:

【参考方案2】:
public partial class User
  
[Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int user_id  get; set; 
    public string username  get; set; 
    public Nullable<System.DateTime> Date_Captured  get; set;        



public ActionResult SaveUser(User user)
    
        using (DBEntities entities = new DBEntities())
         // dont set Id    
            entities.Users.Add(user);                
            entities.SaveChanges();

            return RedirectToAction("Index", "Users");
        
    

【讨论】:

以上是关于尽管提供了值,但实体框架仍插入 null的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止实体框架尝试保存/插入子对象?

实体框架“找不到查询模式的实现”

使用实体框架模型插入数据

尽管代理被禁用,实体框架会自动设置关系

更新映射到视图的实体框架实体

使用实体框架6插入已断开的相关实体