【问题标题】:Add column to cross table generated by EF将列添加到 EF 生成的交叉表
【发布时间】:2019-08-16 23:21:09
【问题描述】:

我正在使用 ASP.NET 和实体框架开发一个签入系统。当您登记到一个部门时,您可以选择您在逗留期间将使用的活动。

我有以下 2 个模型类:

public class Department
{
        public int Id { get; set; }
        public string Name { get; set; }
        public string Street { get; set; }
        public string ZipCode { get; set; }
        public string City { get; set; }
        public virtual List<Activity> Activities { get; set; }
}

public class Activity
{
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual List<Department> Departments { get; set; }
}

因为部门和活动之间是多对多的关系,所以 EF 会生成一个交叉表。

-----------------------------------
| # | Department_Id | Activity_Id |
-----------------------------------

我想在交叉表中添加一个名为 displayOrder 的额外列,以便每个部门都可以选择他们提供的活动以及他们想要显示它们的顺序。

--------------------------------------------------
| # | Department_Id | Activity_Id | DisplayOrder |
--------------------------------------------------

这可能与EF有关还是有更好的方法。如果可能,您将如何获得displayOrder 属性?

【问题讨论】:

  • 你需要在数据库层处理。

标签: c# asp.net visual-studio entity-framework


【解决方案1】:

不确定是否可以让 EF 做到这一点,但可以创建包含 displayOrder 属性的交叉表的部分类。

【讨论】:

    【解决方案2】:

    是的,您需要使用 Department_Id 、Activity_Id 和 DisplayOrder 变量以及它们与对象示例匹配的关系来创建模型:

    public class DepartmentActivity
        {
            #region Public properties
    
            public int ActivityId{ get; set; }
            public int DepartmentId{ get; set; }
            public string DisplayOrder {get;set;} // this can be whatever you like and add more properties if needed
    
            #endregion
    
            #region Relations
    
            public Activity Activity{ get; set; }
            public Department Department { get; set; }
    
            #endregion
        }
    

    之后,将此 DepartmentActivity 类添加到您的 DbSets 以表示您的表并匹配它在模型构建器上的关系

        public DbSet<DepartmentActivity> DepartmentActivities { get; set; }
    
    
            modelBuilder.Entity<DepartmentActivity>().HasKey(x => new { x.ActivityId, x.DepartmentId});
            modelBuilder.Entity<DepartmentActivity>()
                .HasOne(x => x.Activity).WithMany(x => x.Departments );
            modelBuilder.Entity<DepartmentActivity>()
                .HasOne(x => x.Department).WithMany(x => x.Activities);
    

    只需从 ef 运行生成迁移命令,现在应该有一个表可以用作具有更多可选属性的中间表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2014-12-12
      • 2021-10-10
      相关资源
      最近更新 更多