【问题标题】:Cannot insert the value NULL into column error无法将值 NULL 插入列错误
【发布时间】:2013-05-07 12:47:45
【问题描述】:

我正在尝试将用户首选项保存到表中,但出现空异常,我不明白为什么。这是一个 MVC 4 应用程序,这是我收到错误的操作结果。

public ActionResult Go(string path, string name)
    {
        RaterContext r = new RaterContext();
        UserData u = new UserData();

        var userid = u.GetCurrentUserData().UserId;
        var info = r.RatersInfo.Where(w => w.RaterName.Equals(name)).FirstOrDefault();
        var pref = r.RatersPreferences.Where(w => w.RaterId.Equals(info.RaterId) && w.UserId.Equals(userid)).FirstOrDefault();

        if (pref != null && pref.Count > 0)
        {
            pref.Count++;

            r.SaveChanges();
        }
        else
        {
            pref = new RaterPreferences();

            pref.UserId = userid;
            pref.RaterId = info.RaterId;
            pref.Count = 1;

            r.RatersPreferences.Add(pref);
            r.SaveChanges();
        }

        return Redirect(path);
    }

首选项表中还没有保存任何内容,因此它正在点击 else 块并在 r.SaveChanges(); 上引发空异常。例外是

无法将值 NULL 插入“UserId”列,表 'WebSiteNew.dbo.RaterPreferences';列不允许空值。插入 失败。\r\n语句已终止。

这没有意义的原因是,当我单步执行时,包括 UserId 在内的所有三个属性都有数据。这些是表中唯一的字段。 UserId = 1,RaterId = 6 和 Count 明确设置为 1。它们都设置为不可为空的 int,主键是 UserId 和 RaterId 的组合。我的模型如下。

public class RaterContext : DbContext
{
    public RaterContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<RaterInfo> RatersInfo { get; set; }
    public DbSet<RaterPreferences> RatersPreferences { get; set; }
}

[Table("RaterInfo")]
public class RaterInfo
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int RaterId { get; set; }
    public string RaterName { get; set; }
    public string RaterLink { get; set; }
    public string Section { get; set; }
    public string Department { get; set; }
}

[Table("RaterPreferences")]
public class RaterPreferences
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public int RaterId { get; set; }
    public int Count { get; set; }
}

任何帮助将不胜感激,因为我对 MVC 和 ASP.NET 还比较陌生。如果您需要更多信息,请与我们联系。提前致谢!

我不知道这是否有帮助,但我测试了通过手动添加数据来查看 UPDATE 会发生什么,以便它可以捕获 if 块并且有效。我只是在 INSERT 上遇到错误。

这是相关表的创建语句。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[RaterPreferences](
[UserId] [int] NOT NULL,
[RaterId] [int] NOT NULL,
[Count] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
[UserId] ASC,
[RaterId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[RaterPreferences]  WITH CHECK ADD  CONSTRAINT     [FK_RaterPreferences_RaterInfo] FOREIGN KEY([RaterId])
REFERENCES [dbo].[RaterInfo] ([RaterId])
GO

ALTER TABLE [dbo].[RaterPreferences] CHECK CONSTRAINT [FK_RaterPreferences_RaterInfo]
GO

【问题讨论】:

    标签: asp.net sql-server linq-to-sql asp.net-mvc-4


    【解决方案1】:

    我已使用当前版本的 Entity Framework 将您的代码复制到一个全新的 ASP.Net MVC 项目中,并且我能够毫无问题地运行您的代码。我使用如下代码转义了 UserData 采集:

            RaterContext r = new RaterContext();
            //UserData u = new UserData();
    
            var userid = 1; // u.GetCurrentUserData().UserId;
            var info = r.RatersInfo.Where(w => w.RaterName.Equals(name)).FirstOrDefault();
    

    并且运行此代码的其余部分没有问题。

    我认为您的 RaterPreferences 表的键和数据库结构可能存在一些问题。我不知道你的完整数据模型,但我不明白它是如何适应的,而且它没有按照你描述的方式键入你的代码。

    编辑: 我已经修改了我的数据库表以反映您所描述的设计。您的 EntityFramework 代码优先实现与您的数据库之间存在差异。看起来您的数据库首先存在,我将删除您的 EntityFramework 类并使用 Database First 技术重建它们。

    【讨论】:

    • 您已使用 Key 属性修饰了 RaterPreferences 类的 UserID 属性,该属性将 UserID 设置为 RaterPreferences 表的主键中的唯一列。要配置复合主键,您需要在 DbContext 中像这样设置它:luisrocha.net/2010/11/creating-composite-keys-using-code.html
    • 就是这样。我将 [Key, Column(Order = 1)] 添加到 UserId 并将 [Key, Column(Order = 2)] 添加到 RaterId 并且它有效。感谢您抽出宝贵时间对此进行调查。有趣的是,自动生成的成员资格表 pages_UsersInRole 也有一个复合主键,这正是我模仿的我的模型(使用单个 [Key]),但它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多