web-dev-qa-db-ja.com

System.Data.SqlClient.SqlException:無効な列名 'phone_types_phone_type_id'

私は、主な従業員モデルと外部キー関係を持ついくつかのモデルから情報を取得しようとしています。各モデルを個別にマップする場合、通常どおり問題なくアクセスできますが、そうするには複数の異なるWebページにアクセスする必要があります。

私はいくつかのモデルを本質的に単一のコントローラーにマージして、この方法で作業しようとしています。残念ながら、これらのモデルにアクセスしようとすると、奇妙なエラーが表示されます。

System.Data.SqlClient.SqlException:無効な列名 'phone_types_phone_type_id'。

コードを検索した後、_phone_types_phone_type_id_が表示される唯一の場所は、移行コード内にあるようです。私はC#とAsp.Net全般で信じられないほど新しいので、どんな助けも歓迎します。

モデルのコードは次のとおりです。

_[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; }
    }
}
_

そして、私の見解からの適切なコード:

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

[〜#〜] edit [〜#〜]私は問題を発見したかもしれませんが、別の選択肢があれば間違いなくもっと入力を取ります。私の解決策は、この行のすぐ上に[ForeignKey("phone_type")]を取り、追加することでした:_public virtual phone_types phone_types { get; set; }_は_phone_manager_クラスにあります。

11
JD Davis

かなり多くの研究を行った後、私はかなりユニークな問題を抱えていたようです。ここと他の多くのサイトの両方にリストされているいくつかの修正を試みましたが、問題を修正するものはほとんどありませんでした。

ただし、元の投稿の下部にリストした解決策は機能しており、うまく機能しているように見えるため、これは私の問題に対するかなり適切な解決策であると考えています。

何が起こっているかをある程度説明するために、MVC EFは2つのモデル間でfk/pk関係を見つけようとしましたが、モデル間で列名が異なるため、それらを適切にマッピングできませんでした。 email_managerテーブルを使用してemail_typesからすべての電子メールを取得しようとした場合、問題ではありませんでしたが、後方に移動し、email_typesから情報を取得してemail_managerからエラーをスローしました。

2つのテーブル間で列名が異なるため、EFは関係を格納する列を作成しようとしましたが、そのような列が存在しないため、エラーがスローされました。これを修正するために必要なのは、外部キー列が実際に何であるかをEFに伝えることであり、それは親モデルを収容するコレクションの上で[ForeignKey("email_type")]を使用して行われます。

そのため、たとえば、新しいemail_typesおよびemail_managerモデルは次のとおりでした。

    [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; }
    }
7
JD Davis

問題は、データ層の接続文字列とWeb層の接続文字列が異なるデータベースを指していることです。

例えばテストデータベースを指すdevデータベースwebappを読み取るデータレイヤー。

同じデータベースを指すように接続文字列を更新します。

または

両方のデータベースに同じテーブルと列があることを確認してください。

17
Moji

私はnopコマースを使用しています。問題を回避するには、データベースマップでignoreを使用する必要がありました。

Ignore(p => p.CategoryAttachmentType);

私が持っていたドメインで

/// <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

[Table("employee.employees")]を使用してデータベーステーブルを指定しました。データベースの表を確認してください。名前がphone_types_phone_type_id .Itその列のデータを見つけようとしましたが、列が見つからなかったため、このメッセージをスローしました。私の問題は解決しましたデータベースデータベーステーブルを確認してください。

0
Aminur Rahman