2016-01-23 110 views
0

我想将我的注册表格中的数据发布到我的数据库中。起初,我有一个非常常见的错误“实体类型<model>不是当前上下文的模型的一部分” 。我解决了它,然后出现了另一个错误。所以现在出现的错误是在SaveChanges部分,它是“找不到实体密码”。我该如何解决这个问题?实体框架DbEntityValidationException - 找不到实体

这里是我的上下文的代码。

public partial class MyDbEntities : DbContext 
{ 
    public MyDbEntities() 
     : base("name=MyDbEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable("Users"); 
     modelBuilder.Entity<User>().Property(u => u.Name).IsRequired().HasMaxLength(256); 
     modelBuilder.Entity<User>().Property(u => u.Surname).IsRequired().HasMaxLength(256); 
     modelBuilder.Entity<User>().Property(u => u.Email).IsRequired().HasMaxLength(200); 
     modelBuilder.Entity<User>().Property(u => u.password).IsRequired().HasMaxLength(100); 
     modelBuilder.Entity<User>().Property(u => u.address).IsRequired(); 
     modelBuilder.Entity<User>().Property(u => u.postcode).IsRequired(); 
     modelBuilder.Entity<User>().Property(u => u.number).IsRequired(); 

    } 
    public override int SaveChanges() 
    { 
     try 
     { 
      return base.SaveChanges(); 
     } 
     catch (DbEntityValidationException ex) 
     { 
      string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage)); 
      throw new DbEntityValidationException(errorMessages); 
     } 
    } 

    public virtual DbSet<User> Users { get; set; } 
} 

这里是我的控制器

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(User U) 
    { 
     using(MyDbEntities db=new MyDbEntities()) 
     { 
      db.Users.Add(U); 
      db.SaveChanges(); 
      ModelState.Clear(); 
      U = null; 
      ViewBag.Message("Seccesfully stored"); 
     } 
     return View(U); 
    } 

的代码和模型 `

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

     [Required] 
     [Display(Name = "Surname")] 
     public string Surname { get; set; } 


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

     [Required] 
     [DataType (DataType.Password)] 
     [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
     [Display(Name = "Password")] 
     public string password { get; set; } 


     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "Confirm Password")] 
     [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
     public string ConfirmPassword { get; set; } 


     [Required] 
     [Display(Name = "Address")] 
     public string address { get; set; } 

     [Required] 
     [Display(Name = "PostVode")] 
     [DataType(DataType.PostalCode)] 
     public string postcode { get; set; } 

     [Required] 
     [Display(Name = "Phone Number")] 
     public string number { get; set; } 
+0

请张贴精确的错误 – Luke

+1

清楚,不是很容易的,因为错误是希腊文写成的,但我会翻译。它表示无法找到名称为“密码”的实体。 –

+1

哈哈哈。好吧。那么我能想到的唯一的事情就是''''''''''''''''''''''属性上有'[Required]'属性,并且你还没有设置它,或者它没有设置在'User U'参数上正在传递给你的方法。 – Luke

回答

0

你需要确保User是属于你的DbContext。这是我有我的设置:

public partial class MyDbEntities : DbContext 
{ 
    public MyDbEntities() 
     : base("name=MyDbEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // Add the mapping class in here, instead of the setup 
     modelBuilder.Configurations.Add(new UserMap()); 
    } 

    public override int SaveChanges() 
    { 
     try 
     { 
      return base.SaveChanges(); 
     } 
     catch (DbEntityValidationException ex) 
     { 
      string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage)); 
      throw new DbEntityValidationException(errorMessages); 
     } 
    } 

    public virtual DbSet<User> Users { get; set; } 
} 

用户映射类,注意从EntityTypeConfiguration<User>继承,我认为这是你错过了位:

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     // Your original setup goes here 
     this.ToTable("Users"); 
     this.Property(u => u.Name).IsRequired().HasMaxLength(256); 
     this.Property(u => u.Surname).IsRequired().HasMaxLength(256); 
     this.Property(u => u.Email).IsRequired().HasMaxLength(200); 
     this.Property(u => u.password).IsRequired().HasMaxLength(100); 
     this.Property(u => u.address).IsRequired(); 
     this.Property(u => u.postcode).IsRequired(); 
     this.Property(u => u.number).IsRequired(); 
    } 
} 

如果不是这样,或者这可能是你错过了。我的DbContext有一个静态构造函数设置数据库初始化程序,如果你没有它已经,尝试添加它:

static MyDbEntities() 
{ 
    Database.SetInitializer<MyDbEntities>(null); 
} 
+0

不幸的是没有运气....让我看看我是否正确...我去了我的dbcontext并添加了你的代码。我创建了一个新的类UserMap,就像你做的那样...但它仍然给我这个错误:( 非常感谢! –

+0

哦,这是一个耻辱然后:(我不知道什么可能导致它 – Luke

+0

现在我做了在我的控制器的方法中的一些变化,我有另一个错误,这可能是一个改进,因为它不是相同的错误hahaha.the错误说无法更新EntitySet'用户',因为它有一个DefiningQuery和元素存在< ModificationFunctionMapping>元素来支持当前的操作。任何想法? –