asp.net mvc - 在第三个 table 中插入多条记录,使用 entity framework 6

asp.net mvc - Inserting multiple records in the third table having foreign keys to parent using entity framework 6

我正在尝试学习如何将 Entity Framework 6 与已创建的数据库一起使用,而不创建 .edmx 文件,即使用 DbContext 和 POCO classes.

这些是我的模型classes:

[Table("Category")]
public class Category
{
   [Key]
   public long CategoryID { get; set; }
   public string CategoryName { get; set; }
}

[Table("RegistrationForm")]
public class RegistrationForm
{
    [Key]
    public int RegistrationID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; } 
    public int Country { get; set; }        
    public string Email { get; set; }       
    public string Phone { get; set; }  
}   

[Table("RegistrationCategory")]
public class RegistrationCategory
{
    [Key]
    public long RegistrationCategory { get; set; }
    public long RegistrationID { get; set; }//Foreign key to RegistrationID in RegistrationForm table in database
    public long CategoryID { get; set; }//Foreign key to CategoryID in Category table in database
}

我的DbContextclass:

public class MyContext : DbContext
{
    public virtual DbSet<RegistrationForm> RegistrationForm { get; set; }
    public virtual DbSet<Category> Category { get; set; }
    public virtual DbSet<RegistrationCategory> RegistrationCategory { get; set; }
}

这里我想使用DbContext的默认模型构建器。用户可以在注册屏幕中select多个类别所以RegistrationCategory table将有多个记录对于每个注册。因此 RegistrationFormRegistrationCategoryone-to-many 关系。

如何编写上述模型之间的外键映射?

如何绑定Categorytable数据到mvc view(listbox)中,这样我们就可以在RegistrationForm中保存一条记录table 和 RegistrationCategory table 中的多个记录 Entity Framework 6?

中不使用循环(使用 c# 模型之间的映射)

这里的数据库模式是 RegistrationFormCategory 之间的多对多关系,带有连接 table。 RegistrationCategory Table 完全没有必要在 Entity Framework 中建模。您将需要使用 Entity Framework Fluent API 来生成正确的映射。

首先,你的 RegistrationForm Table:

public class RegistrationForm
{
    [Key]
    public int RegistrationID { get; set; }
    ...

    // add a navigation property ICollection<Category> to reference the categories
    public virtual ICollection<Category> Categories { get; set; }
}  

接下来,Category class:

public class Category
{
    [Key]
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }

    //Navigation property to reference the RegistrationForms
    public virtual ICollection<RegistrationForm> RegistrationForms { get; set; }
}

接下来,在您的 DbContext 中:注意 复数的变化,以及 RegistrationCategory 的移除,您不需要模型 class完全没有。

public class MyContext : DbContext
{
    public virtual DbSet<RegistrationForm> RegistrationForms { get; set; }
    public virtual DbSet<Category> Categories { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<RegistrationForm>()
        .HasMany(r => r.Categories)
        .WithMany(c => c.RegistrationForms)
        .Map(
            m =>
            {
              m.MapLeftKey("RegistrationID");
              m.MapRightKey("CategoryID");
              m.ToTable("RegistrationCategory");
            }
        );
}

有了这个,您现在可以查询 RegistrationForm 的所有 CategoriesCategory 的所有 RegistrationForms

foreach (var category in registrationForm.Categories)
{
    //do whatever with each category
}