【问题标题】:Many to Many Relationships |Insert | Delete多对多关系 |插入 |删除
【发布时间】:2011-03-26 12:49:04
【问题描述】:

我开始将实体框架(使用 POCO 类)用于带有 Razor 视图的 MVC 3 C# 项目。

我无法使用它实现多对多功能

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

即)公司 ----> CompanyVenue

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

有没有办法让 The Venue 自动存储从 Company 到 Venue 的关系,而无需通过列表选择它?

如果这不可能,任何人都可以分享使用 EF 实现的更好方法。

【问题讨论】:

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


    【解决方案1】:

    只需通过这个简单的设置:

    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 可以在相关实体中进行适当的更新。

    【讨论】:

      【解决方案2】:

      以下是在 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 方法。这就是您映射 Company 和 Venue 之间多对多关系的方式:

      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

      【讨论】:

        猜你喜欢
        • 2012-03-23
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        相关资源
        最近更新 更多