【问题标题】:CTP5 vs release 4.1 EF many to many relationshipCTP5 与 4.1 版 EF 多对多关系
【发布时间】:2011-08-19 13:36:22
【问题描述】:

此代码不起作用。怎么了? OnModelCreating 不会影响任何结果?因为我在我的数据库中看不到“ProductCategories”表。

    public class GoldContext : DbContext
    {
        public virtual DbSet<Prouct> Products { get; set; }
        public virtual DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //HACK:4.1 modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
        modelBuilder.Entity<Product>()
            .HasMany<Category>(m => m.Categories)
            .WithMany().Map(m => 
                m.MapLeftKey("ProductId")
                .MapRightKey("CategoryId")
                .ToTable("ProductCategories"));
        base.OnModelCreating(modelBuilder);
    }
}

//product and category classes look like this.

    public class Product
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Category> Categories { get; set; }
    }

    public class Category
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }

提前致谢。

【问题讨论】:

  • 您能提供更多信息吗?您是否有可能正在寻找错误的数据库和/或上下文?有任何错误信息吗?
  • 嗨,我试图提供更多信息。没有任何错误信息。一切都好!但没有向我们承诺的“ProductCategories”数据表。
  • 这很奇怪,我已将您的实体/映射添加到项目中,并且一切都按预期工作(包括 ProductCategories 表。
  • 顺便说一下,你应该写.WithMany(c =&gt; c.Products)。否则 EF 不会假定 Category.Products 属于您的多对多关系,而是在 CategoryProduct 之间创建第二个一对多关系。 Category.Products 将属于该关系。但这只是附带说明,它不是您当前问题的根源。
  • Slauma,是的,你完全正确。我也为类别写了相同的地图。

标签: entity-framework entity-framework-4 entity-framework-4.1 ef-code-first entity-framework-ctp5


【解决方案1】:

这是我在控制台应用程序中尝试过的,并且按预期工作:

namespace Q7122388
{
    #region Imports

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity;
    using System.Linq;

    #endregion

    public class Product
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Category> Categories { get; set; }
    }

    public class Category
    {
        [Key]
        public int Id { get; set; }

        public virtual string Name { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }

    public class DatabaseContext : DbContext
    {
        public virtual DbSet<Product> Products { get; set; }
        public virtual DbSet<Category> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>()
                .HasMany<Category>(m => m.Categories)
                .WithMany().Map(m =>
                    m.MapLeftKey("ProductId")
                    .MapRightKey("CategoryId")
                    .ToTable("ProductCategories"));
            base.OnModelCreating(modelBuilder);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<DatabaseContext>());
            using (var context = new DatabaseContext())
                context.Database.Initialize(true);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多