【问题标题】:Create relationships with Entity Framework Core使用 Entity Framework Core 创建关系
【发布时间】:2016-09-24 13:15:48
【问题描述】:

我想用 Entity Framework Core 构建一个数据库。我使用命令提示符和迁移来创建数据库。但正如你在我的图表中看到的,我有一个多对多的关系。如何与下面的类创建这种关系?

代码:

public class ShoppingDbContext : IdentityDbContext<User>
{
    public ShoppingDbContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder     optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<Product> Products { get; set; }
    public DbSet<PartCategory> PartCategory { get; set; }
    public DbSet<Part> Parts { get; set; }
}

public class Product 
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public double Price { get; set; }

    public List<PartCategory> PartCategory { get; set; } 
}

public class PartCategory
{
    public int PartCategoryId { get; set; }
    public string Category { get; set; }

    public List<Part> Parts { get; set; }
}

//更新

public class ProductPartCategory
{
public int ProductId { get; set; }
public Product Product { get; set; }

public int PartCategoryId { get; set; }
public PartCategory PartCategory { get; set; }
}

public class Product 
{

public int ProductId { get; set; }
public string ProductName { get; set; }
public double Price { get; set; }
public List<PartCategory> PartCategories{ get; set; } 

}

 public class PartCategory
{
public int PartCategoryId { get; set; }
public string Category { get; set; }
public List<Product> Products { get; set; }

//dont mind this propertie its for other stuff
public List<Part> Parts { get; set; }
}

【问题讨论】:

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


【解决方案1】:

您可以使用 Fluent API 尝试如下所示。

注意:

没有实体类来表示的多对多关系 尚不支持连接表。但是,您可以代表一个 通过包含连接的实体类来实现多对多关系 表和映射两个单独的一对多关系。

public class ShoppingDbContext: DbContext
    {
        public DbSet<Product> Products { get; set; }
        public DbSet<PartCategory> PartCategories{ get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ProductPartCategory>()
                .HasKey(t => new { t.ProductId, t.PartCategoryId });

            modelBuilder.Entity<ProductPartCategory>()
                .HasOne(pt => pt.Product)
                .WithMany(p => p.ProductPartCategories)
                .HasForeignKey(pt => pt.ProductId);

            modelBuilder.Entity<ProductPartCategory>()
                .HasOne(pt => pt.PartCategory)
                .WithMany(t => t.ProductPartCategories)
                .HasForeignKey(pt => pt.PartCategoryId);
        }
    }

你的模型应该是这样的:

 public class Product 
  {

    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public double Price { get; set; }
    public List<ProductPartCategory> ProductPartCategories { get; set; } 

  }

 public class PartCategory
   {
     public int PartCategoryId { get; set; }
     public string Category { get; set; }
     public List<ProductPartCategory> ProductPartCategories { get; set; } 
   }

  public class ProductPartCategory
    {
      public int ProductId { get; set; }
      public Product Product { get; set; }

      public int PartCategoryId { get; set; }
      public PartCategory PartCategory { get; set; }
   }

【讨论】:

  • 我使用了你的代码。但是当我启动网络应用程序时收到此错误消息....您可以在链接中查看 (gyazo.com/cb7df90ddc75c31db451a5cb17e2acf0)
  • 你的代码不是我的。试试我的代码。如上所示。 modelBuilder.Entity&lt;ProductPartCategory&gt;() .HasOne(pt =&gt; pt.Product) .WithMany(p =&gt; p.PartCategories) .HasForeignKey(pt =&gt; pt.ProductId);
  • 使用我给出的确切代码。包括模型类。你必须像我的代码一样更改你的代码。
  • 我所做的只是添加一个铸件。如果我不这样做,我会完全使用您的代码,我会收到此错误消息 (gyazo.com/14b063e96c8f2bca52af21535d03729b)
  • 你能显示你改变的模型代码吗?将其放在名为 Update 的新部分下的原始帖子中。
【解决方案2】:

您已经得到了一些答案,但您可以通过以下方式自己找到答案...

我回答所有 EF 建模问题的方式是让 dotnet 为我对数据结构进行逆向工程。通过在命令行提示符下(从项目文件目录内部)执行脚手架命令,dotnet 将创建一堆文件,然后您可以直接使用这些文件,也可以检查结构并根据自己的喜好删除。

唯一可行的方法是,如果您在开发数据库中正确设置了所有关系(外键等)。

dotnet ef dbcontext scaffold "YourConnectionString" Microsoft.EntityFrameworkCore.SqlServer -a -t PartCategory -t Products -t ProducsPartCategory --o OutputDirectory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2017-02-17
    • 2017-09-26
    相关资源
    最近更新 更多