2

ユーザー設定をテーブルに保存しようとしていますが、null 例外が発生し、その理由がわかりません。これは 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 例外をスローしています。例外は

値 NULL を列 'UserId'、テーブル 'WebSiteNew.dbo.RaterPreferences' に挿入できません。列はヌルを許可しません。INSERT が失敗しました。\r\nステートメントは終了しました。

これが意味を成さない理由は、UserId を含む 3 つのプロパティすべてが、ステップ実行時にデータを持っているためです。これらは、テーブル内の唯一のフィールドです。UserId = 1、RaterId = 6、Count は明確に 1 に設定されています。これらはすべて null 非許容の 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 でのみエラーが発生します。

問題のテーブルの create ステートメントを次に示します。

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
4

1 に答える 1