Абнаўленне дадзеных базы дадзеных у MVC 4

Калі ласка, майце з маёй noobness, я вельмі пачатковец у ASP.NET MVC, я не вельмі разумею, гэта яшчэ.

У асноўным тое, што я хачу зрабіць, гэта абнавіць табліцу ў маёй базе дадзеных з інфармацыі, уведзенай у форму. У мяне ёсць рэгістрацыйная форма з некалькімі варыянтамі: FirstName , LastName , Узрост , Пол , SecretQuestion , SecretQuestionAnswer .

Я хацеў бы ўставіць гэтыя дадзеныя ў маёй табліцы UserProfile (я выкарыстоўваю SimpleMembershipProvider) для адпаведных слупкоў. Вось мой поўны рэестр ActionResult ў маім галоўным кантролеры:

 [HttpPost]
        [ValidateAntiForgeryToken]
        [RecaptchaControlMvc.CaptchaValidatorAttribute]
        public ActionResult Regisztracio(RegisterModel model, bool captchaValid, string captchaErrorMessage)
        {
            if (ModelState.IsValid)
            {
                if (!captchaValid)
                {
                    ModelState.AddModelError("recaptcha", captchaErrorMessage);
                    return View(model);
                }

                try
                {
                    OneMillionDb db = new OneMillionDb();
                    User user = new User();

                    var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
                    user.LastName = model.LastName;
                    user.FirstName = model.FirstName;
                    user.Age = model.Age;
                    user.Sex = model.Sex;
                    user.SecretQuestion = model.SecretQuestion;
                    user.SecretQuestionAnswer = model.SecretQuestionAnswer;
                    db.Users.Add(user);
                    db.SaveChanges();



                        return RedirectToAction("Index");


                }
                catch
                {
                    ModelState.AddModelError("UserName", "The username already exists.");
                    ModelState.AddModelError("Email", "The specified E-mail address already exists.");
                    ModelState.AddModelError("ConfirmEmail", "");
                    return View(model);
                }
            }
            return View(model);
        }

OneMillionDb is my dbContext model file:

public class OneMillionDb : DbContext
    {
        public OneMillionDb()
            : base("DefaultConnection")
        {
        }
        public DbSet Users { get; set; }
    }

User is my model class for table definiton. It looks like this:

[Table("UserProfile")]
    public class User
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        [Column]
        [Required]
        public string UserName { get; set; }
        [Column]
        public string FirstName { get; set; }
        [Column]
        public string LastName { get; set; }
        [Column]
        [Required]
        public int Age { get; set; }
        [Column]
        public string Sex { get; set; }
        [Column]
        [Required]
        public string SecretQuestion { get; set; }
        [Column]
        [Required]
        public string SecretQuestionAnswer { get; set; }
        [Column]
        public int MoneyIn { get; set; }
        [Column]
        public int MoneyOut { get; set; }
        [Column]
        public int TimesWon { get; set; }
    }

Я меў звычай працаваць у ASP.NET Web Pages, у тым, што я б выкарыстоўваць UPDATE SQL заяву, каб зрабіць гэта, то выконвае запыту ..

Edit3: Вось мой погляд Рэгістрацыя:

@model OneMillion.Models.RegisterModel
@using Recaptcha;

@{
    ViewBag.Title = "Register";
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    
Register
  • @Html.LabelFor(m => m.UserName) @Html.EditorFor(m => m.UserName)
  • @Html.LabelFor(m => m.Email) @Html.EditorFor(m => m.Email)
  • @Html.LabelFor(m => m.ConfirmEmail) @Html.EditorFor(m => m.ConfirmEmail)
  • @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password)
  • @Html.LabelFor(m => m.ConfirmPassword) @Html.PasswordFor(m => m.ConfirmPassword)
  • @Html.LabelFor(m => m.LastName) @Html.EditorFor(m => m.LastName)
  • @Html.LabelFor(m => m.FirstName) @Html.EditorFor(m => m.FirstName)
  • @Html.LabelFor(m => m.Age) @Html.EditorFor(m => m.Age)
  • @Html.LabelFor(m => m.Sex) @Html.EditorFor(m => m.Sex)
  • @Html.LabelFor(m => m.SecretQuestion) @Html.EditorFor(m => m.SecretQuestion)
  • @Html.LabelFor(m => m.SecretQuestionAnswer) @Html.EditorFor(m => m.SecretQuestionAnswer)
  • @Html.Raw(Html.GenerateCaptcha())
<input type="submit" value="Register" />
 
}

А вось мой RegisterModel:

public class RegisterModel
    {
        [Required]
        [Display(Name = "Felhasználónév")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail cím")]
        public string Email { get; set; }

        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail cím megerősítése")]
        [Compare("Email", ErrorMessage = "A két e-mail cím nem egyezik.")]
        public string ConfirmEmail { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "A jelszónak legalább {2} karakter hosszúnak kell lennie.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Jelszó")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Jelszó megerősítése")]
        [Compare("Password", ErrorMessage = "A jelszó és a jelszó megerősítése mezők nem egyeznek.")]
        public string ConfirmPassword { get; set; }

        [Display(Name= "Vezetéknév")]
        public string LastName { get; set; }

        [Display(Name= "Keresztnév")]
        public string FirstName { get; set; }

        [Display(Name= "Életkor")]
        public int Age { get; set; }

        [Display(Name="Nem")]
        public string Sex { get; set; }

        [Required]
        [Display(Name="Titkos kérdés")]
        public string SecretQuestion { get; set; }

        [Required]
        [Display(Name="Titkos kérdés válasza")]
        public string SecretQuestionAnswer { get; set; }
    }

Edit: My Problem:

База дадзеных не абнаўляецца. Я ведаю гэта, бо я атрымліваю выключэнне пра тое, што слупок Узрост не можа мець значэнне NULL , але адпаведны ўваход быў запоўнены.

Edit2: Я таксама змяніў код, каб адлюстраваць адказ SOfanatic 's, але я ўсё яшчэ атрымліваю памылку.

Edit4: Вось выключэнне я атрымліваю ў ўлове бок trycatch:

Cannot insert the value NULL into column 'Age', table 'OneMillionDb.dbo.UserProfile'; column does not allow nulls. INSERT fails.
0
У чым праблема?
дададзена аўтар Suhas, крыніца
На жаль, я забыўся, што частка. Я рэдагаваў пытанне з падрабязнай інфармацыяй адносна гэтай праблемы.
дададзена аўтар PeterInvincible, крыніца
На жаль, я забыўся, што частка. Я рэдагаваў пытанне з падрабязнай інфармацыяй адносна гэтай праблемы.
дададзена аўтар PeterInvincible, крыніца
@Satish Так, гэта сапраўды мае значэнне, я ўвайшоў у форму. Я не магу выкарыстоўваць [Column (Name = "TableColumnName»)], хоць, ён атрымлівае падкрэсленыя чырвоным у VS. Паведамленне пра памылку: «Name» не з'яўляецца дапушчальным з імем атрыбуту аргумент. Найменныя аргументы атрыбутаў павінны быць палямі, якія не толькі для чытання, статычны або Const, або чытання-запісу уласцівасцяў, якія з'яўляюцца дзяржаўнымі і не статычныя. Акрамя таго, я заўважыў, што выключэнне кінута, калі адладчык пачынае метад WebSecurity.CreateUserAndAccount .. Я паспрабаваў пакласці, што ў ніжняй частцы абнаўлення і цяпер я атрымліваю гэтую excpt: Не атрымалася выканаць праверку аднаго або некалькіх асоб.
дададзена аўтар PeterInvincible, крыніца
@Satish Так, гэта сапраўды мае значэнне, я ўвайшоў у форму. Я не магу выкарыстоўваць [Column (Name = "TableColumnName»)], хоць, ён атрымлівае падкрэсленыя чырвоным у VS. Паведамленне пра памылку: «Name» не з'яўляецца дапушчальным з імем атрыбуту аргумент. Найменныя аргументы атрыбутаў павінны быць палямі, якія не толькі для чытання, статычны або Const, або чытання-запісу уласцівасцяў, якія з'яўляюцца дзяржаўнымі і не статычныя. Акрамя таго, я заўважыў, што выключэнне кінута, калі адладчык пачынае метад WebSecurity.CreateUserAndAccount .. Я паспрабаваў пакласці, што ў ніжняй частцы абнаўлення і цяпер я атрымліваю гэтую excpt: Не атрымалася выканаць праверку аднаго або некалькіх асоб.
дададзена аўтар PeterInvincible, крыніца
Вы маеце рацыю, гэта была праблема. Я сапраўды не разумею, чаму Тхо ён кінуў гэта выключэнне ў першую чаргу, адзін у пытанні, і чаму яна не выкінула пасля перамяшчэння метаду WebSecurity.CreateUserAndAccount на дно .. Ва ўсякім выпадку, гэта працуе perfectely! Уявіце гэта як адказ, калі ласка, так што я магу пазначыць яго як правільны адказ :) Дзякуй за дапамогу!
дададзена аўтар PeterInvincible, крыніца
Поўнае Апошняе выключэнне (не дастаткова месцаў) паведамляе, што праверка ня для аднаго або некалькіх аб'ектаў. Глядзіце ўласцівасць «EntityValidationErrors» для атрымання больш падрабязнай інфармацыі. Edit: Я змяніў ўсё [Colmn] атрыбуты, як вы сказалі, але я ўсё яшчэ атрымліваю памылку. Цяпер я толькі атрымліваю гэта выключэнне. Я паставіў websecurity.createuserandaccount пад db.SaveChanges ()
дададзена аўтар PeterInvincible, крыніца
Поўнае Апошняе выключэнне (не дастаткова месцаў) паведамляе, што праверка ня для аднаго або некалькіх аб'ектаў. Глядзіце ўласцівасць «EntityValidationErrors» для атрымання больш падрабязнай інфармацыі. Edit: Я змяніў ўсё [Colmn] атрыбуты, як вы сказалі, але я ўсё яшчэ атрымліваю памылку. Цяпер я толькі атрымліваю гэта выключэнне. Я паставіў websecurity.createuserandaccount пад db.SaveChanges ()
дададзена аўтар PeterInvincible, крыніца
Вы маеце рацыю, гэта была праблема. Я сапраўды не разумею, чаму Тхо ён кінуў гэта выключэнне ў першую чаргу, адзін у пытанні, і чаму яна не выкінула пасля перамяшчэння метаду WebSecurity.CreateUserAndAccount на дно .. Ва ўсякім выпадку, гэта працуе perfectely! Уявіце гэта як адказ, калі ласка, так што я магу пазначыць яго як правільны адказ :) Дзякуй за дапамогу!
дададзена аўтар PeterInvincible, крыніца
прабачце атрыбут павінен быць [Column ( "TableColumnName")]
дададзена аўтар Satish, крыніца
Вы вызначылі UserName, як патрабуецца, але я не бачу вас ўстаноўка значэння для UserName, што можа быць ваша памылка праверкі.
дададзена аўтар Satish, крыніца
Вы вызначылі UserName, як патрабуецца, але я не бачу вас ўстаноўка значэння для UserName, што можа быць ваша памылка праверкі.
дададзена аўтар Satish, крыніца
прабачце атрыбут павінен быць [Column ( "TableColumnName")]
дададзена аўтар Satish, крыніца
Ці ёсць у model.Age любое значэнне пры адладцы? Вы можаце прафіляванага дб і знайсці атрымаць фактычнае заяву ўстаўкі? Можа быць, ўласцівасць Узрост не атрымлівае адлюстроўваецца ў слупку табліцы. Вы можаце паспрабаваць паставіць слупок Імя ў атрыбуце Column. [Калонка (Name = "TableColumnName")]
дададзена аўтар Satish, крыніца
Ці ёсць у model.Age любое значэнне пры адладцы? Вы можаце прафіляванага дб і знайсці атрымаць фактычнае заяву ўстаўкі? Можа быць, ўласцівасць Узрост не атрымлівае адлюстроўваецца ў слупку табліцы. Вы можаце паспрабаваць паставіць слупок Імя ў атрыбуце Column. [Калонка (Name = "TableColumnName")]
дададзена аўтар Satish, крыніца
Як @Suhas намякае, вы на самой справе не пазначана, у чым праблема. Ці ёсць код, паказаны не працуе, як вы чакаеце, што гэта?
дададзена аўтар Tieson T., крыніца
Як @Suhas намякае, вы на самой справе не пазначана, у чым праблема. Ці ёсць код, паказаны не працуе, як вы чакаеце, што гэта?
дададзена аўтар Tieson T., крыніца

6 адказы

На ваш User клас змяніць наступнае

[Column]
[Required]
public int Age { get; set; }

у

[Column]
public int? Age { get; set; }

Your declaration is making the column NOT NULL and always mandaуry.

1
дададзена

На ваш User клас змяніць наступнае

[Column]
[Required]
public int Age { get; set; }

у

[Column]
public int? Age { get; set; }

Your declaration is making the column NOT NULL and always mandaуry.

1
дададзена

Вы вызначылі UserName ў якасці неабходнага поля ў класе карыстальніка, але вы не прызначаючы ніякага значэння ў поле пры захаванні. Гэта, верагодна, кіданне EntityValidationError.

1
дададзена
Памылка згадана ў пытанні быў на Узрост поля, хоць і не на UserName полі.
дададзена аўтар Suhas, крыніца

Вы вызначылі UserName ў якасці неабходнага поля ў класе карыстальніка, але вы не прызначаючы ніякага значэння ў поле пры захаванні. Гэта, верагодна, кіданне EntityValidationError.

1
дададзена
Памылка згадана ў пытанні быў на Узрост поля, хоць і не на UserName полі.
дададзена аўтар Suhas, крыніца

Абнаўленне сутнасці аналагічна даданне сутнасці, таму ў кодзе:

try {
   OneMillionDb db = new OneMillionDb();
   User user = new User();

   var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
   user.LastName = model.LastName;
   user.FirstName = model.FirstName;
   user.Age = model.Age;
   user.Sex = model.Sex;
   user.SecretQuestion = model.SecretQuestion;
   user.SecretQuestionAnswer = model.SecretQuestionAnswer;
   db.Users.Add(user);
   db.SaveChanges();
   return RedirectToAction("Index");
}

change the db.Users.Add(user) to db.Entry(user).State = EntityState.Modified

1
дададзена
Я ўсё яшчэ атрымліваю памылку (я рэдагаваў пытанне), дзякуй Тхо за дапамогу :)
дададзена аўтар PeterInvincible, крыніца

Абнаўленне сутнасці аналагічна даданне сутнасці, таму ў кодзе:

try {
   OneMillionDb db = new OneMillionDb();
   User user = new User();

   var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
   user.LastName = model.LastName;
   user.FirstName = model.FirstName;
   user.Age = model.Age;
   user.Sex = model.Sex;
   user.SecretQuestion = model.SecretQuestion;
   user.SecretQuestionAnswer = model.SecretQuestionAnswer;
   db.Users.Add(user);
   db.SaveChanges();
   return RedirectToAction("Index");
}

change the db.Users.Add(user) to db.Entry(user).State = EntityState.Modified

1
дададзена
Я ўсё яшчэ атрымліваю памылку (я рэдагаваў пытанне), дзякуй Тхо за дапамогу :)
дададзена аўтар PeterInvincible, крыніца