web-dev-qa-db-fra.com

System.Data.SqlClient.SqlException: nom de colonne non valide 'phone_types_phone_type_id'

J'essaie d'obtenir des informations de certains de mes modèles qui ont une relation de clé étrangère avec le modèle de mon employé principal. Si je mappe chaque modèle individuellement, je peux y accéder comme d'habitude sans problème, mais je dois visiter plusieurs pages Web différentes pour le faire.

J'essaie de fusionner plusieurs de mes modèles dans essentiellement un seul contrôleur et de travailler avec eux de cette façon. Malheureusement, lorsque j'essaie d'accéder à ces modèles, une erreur étrange se produit: 

System.Data.SqlClient.SqlException: nom de colonne non valide "phone_types_phone_type_id".

Après une recherche dans mon code, le seul emplacement où phone_types_phone_type_id apparaît est apparemment dans mon code de migration. Je suis incroyablement nouveau chez C # et Asp.Net en général, alors toute aide est la bienvenue.

Voici le code pour mon modèle:

[Table("employee.employees")]
public partial class employees1
{
    public employees1()
    {
        employee_email_manager = new List<email_manager>();
        employee_employment_history = new HashSet<employment_history>();
        employee_job_manager = new HashSet<job_manager>();
        employee_phone_manager = new HashSet<phone_manager>();
        this.salaries = new HashSet<salary>();
    }

    [Key]
    public int employee_id { get; set; }
    [Display(Name="Employee ID")]
    public int? assigned_id { get; set; }

    [Display(Name="Web User ID")]
    public int? all_id { get; set; }

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

    [StringLength(50)]
    [Display(Name="Last Name")]
    public string last_name { get; set; }

    [Column(TypeName = "date")]
    [Display(Name="Birthday")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime birth_day { get; set; }

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

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

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

    [StringLength(50)]
    [Display(Name="Suite/Apt#")]
    public string address_line_2 { get; set; }

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

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

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

    [Column(TypeName = "date")]
    [Display(Name="Hire Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime hire_date { get; set; }

    [Column(TypeName = "date")]
    [Display(Name="Separation Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime? termination_date { get; set; }

    [StringLength(70)]
    [Display(Name="Emergency Contact Name")]
    public string emergency_contact_name { get; set; }

    [StringLength(15)]
    [Display(Name = "Emergency Contact Number")]
    public string emergency_contact_phone { get; set; }

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

    public virtual ICollection<phone_manager> employee_phone_manager { get; set; }

    [Table("employee.phone_manager")]
    public partial class phone_manager
    {
        [Key]
        public int phone_id { get; set; }

        public int employee_id { get; set; }

        [Required]
        [StringLength(15)]
        public string phone_number { get; set; }

        [StringLength(5)]
        public string phone_extension { get; set; }

        public int phone_type { get; set; }

        [Column(TypeName = "date")]
        public DateTime date_added { get; set; }

        public bool deleted { get; set; }

        public virtual employees1 employees1 { get; set; }

        public virtual phone_types phone_types { get; set; }
    }

    [Table("employee.phone_types")]
    public partial class phone_types
    {
        public phone_types()
        {
            phone_manager = new HashSet<phone_manager>();
        }

        [Key]
        public int phone_type_id { get; set; }

        [Required]
        [StringLength(50)]
        public string phone_type_name { get; set; }

        public virtual ICollection<phone_manager> phone_manager { get; set; }
    }
}

Et le code pertinent de mon point de vue:

        @foreach (var item in Model.employee_phone_manager)
        {
            @Html.DisplayFor(modelItem => item.phone_number); 
            @: - 
            @Html.DisplayFor(modelItem => item.phone_type);
            <br />
        }

EDITJ'ai peut-être découvert le problème, mais je prendrai certainement plus de données s'il y a une autre option. Ma solution était de prendre et d'ajouter ce qui suit: [ForeignKey("phone_type")] directement au-dessus de cette ligne: public virtual phone_types phone_types { get; set; } dans ma classe phone_manager.

7
JD Davis

Après avoir fait un peu plus de recherches, il me semble que mon problème est assez unique. J'ai essayé plusieurs des solutions répertoriées ici et sur de nombreux autres sites, mais presque rien ne semblait résoudre le problème.

Cependant, la solution que j'ai énumérée au bas de mon message original semble fonctionner et tient bien le coup. Je pense donc que c'est une solution assez adéquate à mon problème.

Pour décrire un peu ce qui se passait, MVC EF tentait de trouver une relation fk/pk entre deux modèles, mais comme les noms de colonne étaient différents, il n’était pas possible de les mapper correctement. Si j'essayais d'obtenir tous les courriels de email_manager en utilisant la table email_types, ce n'était pas un problème, mais revenir en arrière et récupérer les informations de email_types à partir de email_manager générait des erreurs.

Comme les noms de colonne entre les deux tables sont différents, EF a tenté de créer une colonne pour héberger la relation, mais comme aucune colonne de ce type n'existait, une erreur a été générée. Pour corriger cela, il suffit d'indiquer à EF la nature de la colonne de clé étrangère, à l'aide de [ForeignKey("email_type")] situé au-dessus de la collection hébergeant le modèle parent.

Ainsi, par exemple, mes nouveaux modèles email_types et email_manager étaient les suivants:

    [Table("employee.email_manager")]
    public partial class email_manager
    {
        [Key]
        public int email_id { get; set; }

        public int employee_id { get; set; }

        [Required]
        [StringLength(255)]
        public string email { get; set; }

        public int email_type { get; set; }

        [Column(TypeName = "date")]
        public DateTime date_added { get; set; }

        public bool deleted { get; set; }
        [ForeignKey("email_type")]
        public virtual email_types email_types { get; set; }

        public virtual employees1 employees1 { get; set; }
    }

    [Table("employee.email_types")]
    public partial class email_types
    {
        public email_types()
        {
            email_manager = new HashSet<email_manager>();
        }

        [Key]
        public int email_type_id { get; set; }

        [Required]
        [StringLength(50)]
        public string email_type_name { get; set; }

        public virtual ICollection<email_manager> email_manager { get; set; }
    }
5
JD Davis

Votre problème est que votre chaîne de connexion dans la couche de données et votre chaîne de connexion dans la couche Web pointent vers différentes bases de données.

par exemple. couche de données lisant la base de données dev webapp pointant sur la base de données de test.

soit mettre à jour les chaînes de connexion pour pointer vers la même base de données  

ou 

assurez-vous que vos deux bases de données ont les mêmes tables et colonnes

11
Moji

J'utilise nop commerce et pour résoudre mon problème, je devais utiliser ignore dans la base de données.

Ignore(p => p.CategoryAttachmentType);

Dans le domaine que j'avais

/// <summary>
    /// Gets or sets the category attachment type
    /// </summary>
    public CategoryAttachmentType CategoryAttachmentType
    {
        get
        {
            return (CategoryAttachmentType)this.CategoryAttachmentTypeId;
        }
        set
        {
            this.CategoryAttachmentTypeId = (int)value;
        }
    }
0
Web Devvy

Vous avez spécifié la table de base de données à l'aide de [Table("employee.employees")]. Vérifiez que votre table de base de données contient une colonne dont le nom est phone_types_phone_type_id. Essayez de trouver les données de cette colonne mais la colonne n'a pas été trouvée, puis envoyez ce message. Mon problème est résolu Consultez ma base de données base de données Table.

0
Aminur Rahman