2013-02-13 182 views
0

大家好,我需要一些幫助(再次),我在玩MVC 4項目,我使用Code First創建了我的模型,並且在構建項目時我沒有任何錯誤,但當我嘗試在Proyectos表中添加新記錄時,出現錯誤消息,請求某些屬性爲,但此屬性來自另一個實體。錯誤必需屬性使用MVC 4

生成錯誤的屬性是來自Usuario實體的UserName,Password和Nombre以及來自Status實體的Descripcion。

我會感謝您的幫助。

更新1:如果我評論Usuario和狀態中的屬性中的[必需的]行,我得到這個錯誤{「不能將值NULL插入列'Descripcion',表'NTSControl.dbo.tbStatus';列「}

但是爲什麼試圖在表中插入一個值呢?

下面是代碼

//Model Proyecto 
public class Proyecto 
{ 

    [Required (ErrorMessage="Número de Proyecto Es Requerido")] 
    [Key] 
    [Display(Name = "Num. Proyecto")] 
    public virtual String ProyectoID { get; set; } 

    [Required (ErrorMessage="ID de Usuario Requerido ")] 
    [Display(Name = "ID Usuario")] 
    public virtual int UserID { get; set; } 

    [Required (ErrorMessage="Order de Compra Es Requerido")] 
    [Display(Name = "O.C. Cliente")] 
    public virtual String OCCliente { get; set; } 

    [Required (ErrorMessage="El Monto Del Proyecto Es Requerido")] 
    [Display(Name = "Monto")] 
    public virtual decimal Monto { get; set; } 

    [Required (ErrorMessage="Numero de Cotizacion Es Requerido")] 
    [Display(Name = "Cotizacion NTS")] 
    public virtual String CotizacionNTS { get; set; } 

    [Required(ErrorMessage="Fecha De Inicio Es Requerido")] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Fecha De Inicio")] 
    public virtual DateTime FechaInicio { get; set; } 

    [Display(Name = "Fecha de Fin")] 
    public virtual DateTime? FechaFin { get; set; } 

    [Display(Name = "Tipo de Moneda")] 
    public virtual String TipoMoneda { get; set; } 

    [Display(Name = "Descripcion")] 
    public virtual String Descripcion { get; set; } 

    [Display(Name = "Monto M.N.")] 
    public virtual Nullable<decimal> MontoMN { get; set; } 

    [Display(Name = "Tipo de Cambio")] 
    public virtual Nullable<decimal> CambioMoneda { get; set; } 

    [Required] 
    [Display(Name = "Status")] 
    public virtual int StatusID { get; set; } 

    public virtual Status Statuses { get; set; } 
    public virtual Usuario Usuarios { get; set; } 

    public virtual ICollection<Comentario> Comentarios { get; set; } 
    public virtual ICollection<Abono> Abonos { get; set; } 
    public virtual ICollection<Cargo> Cargos { get; set; } 

    } 

    //DBContext 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer<NTSControlDB>(null); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     #region Mapping Proyectos 
      //Mapping Atributes with Field Proyectos 
      modelBuilder.Entity<Proyecto>() 
       .Map(m => 
       { 
        m.ToTable("tbProyecto"); 
       }) 
       .HasRequired(s => s.Statuses) 
       .WithMany() 
       .HasForeignKey(s => s.StatusID) 
       .WillCascadeOnDelete(false); 

      modelBuilder.Entity<Proyecto>() 
       .HasRequired(u => u.Usuarios) 
       .WithMany() 
       .HasForeignKey(u => u.UserID) 
       .WillCascadeOnDelete(false); 
    } 

    //Create Proyecto Controller 

    [HttpPost] 
    public ActionResult Create(Proyecto proyecto) 
    { 

     proyecto.UserID = proyecto.Usuarios.UserID; 
     proyecto.StatusID = proyecto.Statuses.StatusID; 

     try 
     {   
       db.Proyectos.Add(proyecto); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
     } 
     catch (DbEntityValidationException ex) 
     { 
      foreach (var validationErrors in ex.EntityValidationErrors) 
      { 
       foreach (var validationError in validationErrors.ValidationErrors) 
       { 
        Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
       } 
      } 

     } 
     return View(); 
    } 



public class Usuario 
{ 
    [Required] 
    [Key] 
    [Display(Name = "Id")] 
    public virtual int UserID { get; set; } 

    [Required] 
    [MaxLength(3)] 
    [Display(Name = "Usuario")] 
    public virtual String UserName { get; set; } 

    [Required] 
    [Display(Name = "Password")] 
    public virtual String Password{ get; set; } 

    [Required] 
    [Display(Name = "Nombre")] 
    public virtual String Nombre { get; set; } 

    [Display(Name = "Email")] 
    public virtual String Email { get; set; } 

    [Required] 
    [Display(Name = "Nivel")] 
    public virtual int Nivel { get; set; }   
} 

public class Status 
{ 
    [Required] 
    [Key] 
    [Display(Name = "Id")] 
    public virtual int StatusID { get; set; } 

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

回答

0

你 「PROYECTO」 類有 「Usuario」 對象是:

public virtual Usuario Usuarios { get; set; } 

和用戶名,密碼等都是[必需]在裏面。如果你註釋掉[必須],它會讓你保存它,然後呢?

+0

如果我評論那行代碼,我得到這個** {「不能將值NULL插入列'Descripcion',表'NTSControl.dbo.tbStatus';列不允許爲空,INSERT失敗。\ r \ n聲明已經被終止。「}但是爲什麼試圖插入該表中? – 2013-02-13 00:23:01

+0

你已經基本上定義了一個與另一個類有關係的類。上面你試圖在db中創建一條記錄在這一行:db.Proyectos.Add(proyecto); 這是要插入所有類的對象,包括引用如:公共虛擬Usuario Usuarios {得到;組; }; – Losbear 2013-02-13 00:47:49

+0

(續)你有幾個選擇。您可以在創建類時爲每個屬性設置默認值(public proyecto(){...將每個參數設置爲值...})以避免您提到的NULL錯誤,或者您可以創建一個新的「proyecto」對象你會插入 - 注意:由新proyecto,我的意思是datacontext.whatever.proyecto,而不是你的問題上面的POCO。 - 希望我有道理:) – Losbear 2013-02-13 00:51:32