ASP.NET MVC在两个单独的表中插入
本文关键字:单独 两个 插入 MVC NET ASP | 更新日期: 2023-09-27 17:53:21
大家好,我是一个ASP新手。净MVC。
我有三个类别Login
, User
和TheTradersContext
,如下所示:
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
.
从你的代码,似乎有一个关系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();
希望他能帮到你
注意:您的类设计可以改进和规范化,以反映数据库关系