ASP.NET MVC插入两个单独的表中

时间:2014-03-24 23:02:26

标签: c# exception model-view-controller insert

您好,我是ASP.NET MVC的新手。

我有三个课程LoginUserTheTradersContext,如下所示:

namespace SimpleUser.Models
{
    [Table("login")]
    public class Login
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Required]
        [StringLength(50)]
        [Display(Name = "Email")]
        public string email { get; set; }

        [Required]
        [DataType(DataType.Password)]

        [Display(Name = "Password")]
        public string password { get; set; }

        public string status { get; set; }

        public string salt { get; set; }
    }
}
namespace SimpleUser.Models
{
    [Table("userdata")]
    public class User
    {

        public int ID { get; set; }
        public string surname { get; set; }
        public string name { get; set; }
        public string sex { get; set; }
        public string city { get; set; }
        public string address { get; set; }
        public string zipcode { get; set; }
        public string tel { get; set; }
        public string bdate { get; set; }
        public string country { get; set; }
    }
}
namespace SimpleUser.Models
{
    public class TheTradersContext : DbContext
    {
        public DbSet<Login> loginusers { get; set; }
        public DbSet<User> allusers { get; set; }

    }
}

然后我创建了一个具有寄存器功能的LoginController.cs,其中我尝试传递我的数据库的两个不同的表,我从formcollection中获取的元素,如下所示。问题是我的数据库只在表登录中传递,而不是在userdata中传递。

[HttpPost]
public ActionResult Registration(FormCollection forms){

    var db = new TheTradersContext();
    var crypto = new SimpleCrypto.PBKDF2();

    var p = forms["password"].ToString();
    String encryptPass = crypto.Compute(p);

     var newUser = db.loginusers.Create();
     var nuser = db.allusers.Create();

     newUser.email = forms["email"].ToString();
     newUser.password = encryptPass;
     newUser.status = "user";
     newUser.salt = crypto.Salt;


    //nuser.ID=Convert.ToInt32("18");
    nuser.surname = forms["lastname"].ToString();
    nuser.name = forms["firstname"].ToString();
    nuser.sex = forms["gender"].ToString();
    nuser.city = forms["city"].ToString();
    nuser.address = forms["addr"].ToString();
    nuser.zipcode =forms["zip"].ToString();
    nuser.tel = "fdgfdgf".ToString();
    nuser.country = forms["country"].ToString();
    nuser.bdate ="dsafdsaf".ToString();

    try
    {
       db.loginusers.Add(newUser);

      db.SaveChanges();
        var useri = db.loginusers.Single(u => u.email == newUser.email);
        if (useri == null) {
            throw new Exception();
        }


        nuser.ID = Convert.ToInt32(useri.ID);
        db.allusers.Add(nuser);

        db.SaveChanges();

    }
    catch (Exception x)
    {
        ModelState.AddModelError("", "This username is in use");
    }

    return View();
}

我在数据库中的表与用户的字段名称完全相同。

当然,我试图排除与登录有关的代码,只传递数据库中userdata的值,但我看到了异常:System.Data.Entity.Infrastructure.DbUpdateException

到目前为止,我已经尝试了很多东西......任何想法?

1 个答案:

答案 0 :(得分:0)

从你的代码中看来,登录和用户之间存在1对多的关系,每次登录都有1个或更多用户(我想你自己试图放nuser.ID = Convert.ToInt32(useri.ID);)

你班上的

用户放了一个名为public Login Login{get; set;}

的导航属性

并且User类应该有一个主键让我们说(UserId),除非您将ID标记为主键,那么您的User表是一个弱实体。 并将新属性Login的ForeignKey标记为ForeignKey(“ID”)

执行此操作后,您可以轻松地执行以下操作

var login=new Login();
// fill out the login data
db.loginusers.Add(login)

db.allusers.Add(new User(){
   surname = forms["lastname"].ToString(),
   name = forms["firstname"].ToString(),
   sex = forms["gender"].ToString(),
   city = forms["city"].ToString(),
   address = forms["addr"].ToString(),
   zipcode =forms["zip"].ToString(),
   tel = "fdgfdgf".ToString(),
   country = forms["country"].ToString(),
   bdate ="dsafdsaf".ToString(),
   Login=login 
});

db.SaveChanges();

希望他能帮助你

注意:您的类设计可以改进和规范化以反映数据库关系