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

本文关键字:单独 两个 插入 MVC NET ASP | 更新日期: 2023-09-27 17:53:21

大家好,我是一个ASP新手。净MVC。

我有三个类别Login, UserTheTradersContext,如下所示:

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中获取的元素,如下所示。问题是,在我的数据库中,只在表login中传递,而不是在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();
}

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

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

到现在为止,我已经尝试了很多事情。任何想法?

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

从你的代码,似乎有一个关系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();

希望他能帮到你

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