【问题标题】:Enumerating value across a foreign key relationship in MVC?在 MVC 中跨外键关系枚举值?
【发布时间】:2014-04-28 18:34:41
【问题描述】:

我的数据库有各种不同的表,它们通过使用标准的 fk 关系相互引用。我正在尝试弄清楚如何设置我的控制器和视图以从主视图中显示这些其他表/模型的内容。

如果这有点令人困惑,我深表歉意,但这里有一个例子。我有一个表employees,我试图在我的详细视图中列出该员工的所有电子邮件,电子邮件存储在email_manager 中,并且有一个外键引用@987654324 中的employee_id 列@ 桌子。我的employee 模型看起来像这样:

[Table("employee.employees")]
public partial class employees1
{
    public employees1()
    {
        employee_email_manager = new HashSet<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 all_employees all_employees { get; set; }

    public virtual ICollection<email_manager> employee_email_manager { get; set; }

    public virtual ICollection<employment_history> employee_employment_history { get; set; }

    public virtual ICollection<job_manager> employee_job_manager { get; set; }

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

    public virtual ICollection<salary> salaries { get; set; }

而我的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; }

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

【问题讨论】:

    标签: c# sql sql-server asp.net-mvc


    【解决方案1】:

    解决这个问题对我来说实际上是一项整天的任务,但我终于设法破解了答案。事实证明,即使我的外键映射到 ApplicationDbContext 中,它们也没有被正确映射。这让我很头疼,事实证明这与我问的另一个问题 Here 密切相关。

    为了解决这个问题,我必须在我的每个模型中明确定义我的外键列,在我的集合上方使用[ForeignKey("FOREIGN_KEY_COLUMN")] 来容纳具有相应主键的模型。修正后的版本类似于:

        [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; }
    
            //[ForeignKey("email_type")]
            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; }
        }
    

    在视图中,要引用适当的电子邮件,您可以执行类似的操作:

        <dt>
            @Html.DisplayNameFor(model => model.employee_email_manager)
        </dt>
    
        <dd>
            @foreach (var item in Model.employee_email_manager)
            {
                <text>@Html.DisplayFor(modelItem => item.email_types.email_type_name): </text>
                @Html.DisplayFor(modelItem => item.email)
                <br />
            }
        </dd>
    

    此更改不需要以任何方式更改我的 employees1 模型,只需要更改引用的模型,例如 email_managerphone_manager 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多