多对多的关系|插入|删除

时间:2011-03-26 12:49:04

标签: entity-framework asp.net-mvc-3 many-to-many relational-database

我开始使用Entity Framework(使用POCO类)进行Razor Views的MVC 3 C#项目。

我无法用它来表达多对多的功能

我正在尝试创建一个视图,当用户能够通过多对多关系添加电话号码,电子邮件,音乐类型,旗帜,保留,ntoes等时

即。)公司----> CompanyVenue< ---- Venue

我已经设法让EF存储场地,然后通过选择列表中的场地并分配给公司来设置场地。

有没有办法让The Venue自动存储从公司到场馆的关系,而不必通过列表选择它?

如果不可能,任何人都可以使用EF分享更好的Implimenting方式。

2 个答案:

答案 0 :(得分:0)

只需进行这种简单的设置:

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

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

EF应该能够确定您宣布多对多关系。我不知道你是使用EF 4.1 Code First还是模型设计师,但是Code First应该为此创建CompanyVenue表。模型设计师将为您定义“链接”表,并在您声明多对多关系时立即定义。

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

答案 1 :(得分:0)

以下是如何在Code First中手动执行此操作。首先,您的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; }
}

在你的DbContext中:

public IDbSet<Company> Companies { get; set; }
public IDbSet<Venue> Venues { 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);
}

我在这里用完整的示例代码回答了另外一个EF很多问题:

MVC many to many

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

第1部分:

Saving many to many part 1

第2部分:

Saving many to many part 2