【问题标题】:Configuring many-to-many relationship in EntityFramework在 EntityFramework 中配置多对多关系
【发布时间】:2016-07-24 18:33:38
【问题描述】:

我正在使用 ASP.NET MVC 创建示例 Web 应用程序,并且我想配置多对多关系。我有产品和交易。我想让每笔交易都包含一个或多个产品。我有一个代码优先类定义如下:

public class Product
{
    public int ProductID { get; set; }

    public string Name { get; set; }

}

public class Transaction
{
    public int TransactionID { get; set; }

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

}

然后,我在我的ApplicationDbContext 中添加了一些东西,最后看起来是这样的:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    //protected override void OnModelCreating(DbModelBuilder modelBuilder)
    //{
    //    modelBuilder.Entity<Transaction>().HasMany(x => x.Products).WithMany();
    //}

    public DbSet<Product> Products { get; set; }

    public DbSet<Transaction> Transactions { get; set; }
}

之后,我启用了迁移,并添加了一些我想在我的数据库中显示的测试数据。测试数据如下:

protected override void Seed(MyApp.Models.ApplicationDbContext context)
{
    var pr = new List<Product>();
    pr.Add(new Product { Name = "Book" });
    pr.Add(new Product { Name = "Table" });
    pr.Add(new Product { Name = "Chair" });

    pr.ForEach(i => context.Products.AddOrUpdate(p => p.Name, i));
    context.SaveChanges();

    context.Transactions.AddOrUpdate(
        t => t.Products,
        new Transaction { Products = new List<Product>(pr.Where(p => p.Name == "Book" || p.Name == "Table")) },
        new Transaction
        {
            Products = new List<Product>(pr.Where(p => p.Name == "Chair" || p.Name == "Book" || p.Name == "Table"))
        }
    );

    context.SaveChanges();
}

然后,我创建了一个新的迁移,并更新了数据库。但是,当我检查表格时,事务表中只有TransactionID 列,并且没有包含产品ID 的Products 列。相反,产品表中有一个名为Transaction_TransactionID 的新列,但它保存了产品所属的最新交易的ID。所以,关系不太对。

可以看出,我还注释掉了一个方法,我想手动指定多对多关系。但是,当我取消注释并尝试更新数据库时,我收到了一些错误,其中之一是:

IdentityUserRole: : EntityType 'IdentityUserRole' 没有定义键。 定义此 EntityType 的键

有什么想法可以实现我想要的吗?在项目的后期,我需要查询交易,找到哪些产品参与了哪些交易。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-mvc-5


    【解决方案1】:

    当您建立多对多关系时,将为它创建第三个表,其中包含两个表的主键。

    您应该在上下文类中指定多对多关系,就像您在注释部分中所做的那样。但是,由于 ApplicationDbContext 继承自 IdentityDbContext 类,您应该调用 base.OnModelCreating 以便也应用 base.OnModelCreating 的模型定义。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Transaction>().HasMany(x => x.Products).WithMany();
        base.OnModelCreating(modelBuilder);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2013-01-25
      • 2017-09-22
      • 1970-01-01
      • 2011-01-04
      相关资源
      最近更新 更多