Entity framework 多对多关系|插入|删除

Entity framework 多对多关系|插入|删除,entity-framework,asp.net-mvc-3,many-to-many,relational-database,Entity Framework,Asp.net Mvc 3,Many To Many,Relational Database,我开始使用实体框架(使用POCO类)来实现一个带有Razor视图的MVC3C项目 我很难用它实现多对多功能 我试图创建一个视图,当用户能够添加电话号码、电子邮件、音乐类型、标志、等待、NTOE等时。。。通过多对多关系 i、 e.)公司-->CompanyVenue只需通过以下简单设置: public Company { public virtual ICollection<Venue> Venues { get; set; } } public Venue { pu

我开始使用实体框架(使用POCO类)来实现一个带有Razor视图的MVC3C项目

我很难用它实现多对多功能

我试图创建一个视图,当用户能够添加电话号码、电子邮件、音乐类型、标志、等待、NTOE等时。。。通过多对多关系


i、 e.)公司-->CompanyVenue只需通过以下简单设置:

public Company
{
    public virtual ICollection<Venue> Venues { get; set; }
}

public Venue
{
    public virtual ICollection<Company> Companies { get; set; }
}
上市公司 { 公共虚拟ICollection场馆{get;set;} } 公共场所 { 公共虚拟ICollection公司{get;set;} } EF应该能够确定您正在声明一个多对多关系。我不知道您是使用EF 4.1 Code First还是使用model designer,但Code First应该具备足够的能力来为您创建CompanyVenue表。当您声明多对多关系时,模型设计器将为您定义“链接”表


请注意,导航属性标记为
virtual
。对于集合,这是必要的,以便EF可以在相关实体中进行适当的更新。

以下是如何首先在代码中手动执行此操作。首先,您的POCO类可能如下所示:

public class Company
{
    public Company()
    {
        Venues = new List<Venue>();
    }
    public int CompanyID { get; set; }
    public string CompanyName { get; set; }
    public virtual ICollection<Venue> Venues { get; set; }
}

public class Venue
{
    public int VenueID { get; set; }
    public string VenueName { get; set; }
    public virtual ICollection<Company> Companies { get; set; }
}
上市公司
{
上市公司()
{
场馆=新列表();
}
public int CompanyID{get;set;}
公共字符串CompanyName{get;set;}
公共虚拟ICollection场馆{get;set;}
}
公共课堂场地
{
public int VenueID{get;set;}
公共字符串VenuName{get;set;}
公共虚拟ICollection公司{get;set;}
}
在您的环境中:

public IDbSet<Company> Companies { get; set; }
public IDbSet<Venue> Venues { get; set; }
公共IDbSet公司{get;set;}
公共IDbSet场地{get;set;}
同样在DbContext类中,重写OnModelCreating方法。以下是您如何映射公司和场所之间的多对多关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
        .HasMany(comp => comp.Venues)
        .WithMany(venue => venue.Companies)
        .Map(mc =>
        {
        mc.ToTable("T_Company_Venue");
        mc.MapLeftKey("CompanyID");
        mc.MapRightKey("VenueID");
        }
    );

    base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(综合=>综合场馆)
.WithMany(场馆=>场馆公司)
.Map(mc=>
{
mc.ToTable(“T_公司/场地”);
MapLeftKey mc(“公司ID”);
mc.MapRightKey(“VenueID”);
}
);
基于模型创建(modelBuilder);
}
我在这里用完整的示例代码回答了另一个EF多对多问题:

我还将上述内容写进了两篇博文,其中包含完整的解决方案和示例代码,可供下载:

第1部分:

第2部分: