如何在 .Net Core 中配置一对多关系

How can i configure one-to-many relationship in .Net Core

我想在 Ef core 中配置 一对多 关系。如您所见,我有一个 class 用于 order,另一个用于 OrderItems。 我在使用 NHibernate.of 课程时这样做,我将 orderItem class 视为 ValueObject.But 我想使用 EF Core 来做到这一点。

public class Order 
{
    public long Id { get; set; }
    public long CustomerId { get; set; }
    public DateTime OrderDateTime { get; set; }

    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem  
{
    public string BookId { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal? Discount { get; set; }
    public decimal Total { get; set; }

    public Order Order { get; set; }

}

下面是一个简单的演示:

1.Model:

public class Order
{
    public long Id { get; set; }
    public long CustomerId { get; set; }
    public DateTime OrderDateTime { get; set; }

    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int OrderItemId { get; set; }//you need to define a primary key for OrderItem model
    public string BookId { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal? Discount { get; set; }
    public decimal Total { get; set; }

    public Order Order { get; set; }

}

2.DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options)
        : base(options)
    {
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderItem> OrderItems { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>()
                    .HasMany(c => c.OrderItems)
                    .WithOne(e => e.Order);
    }
}

3.Startup.cs:

services.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("MyDbContext")));

4.appsettings.json:

"ConnectionStrings": {
   "MyDbContext": "Server=(localdb)\mssqllocaldb;Database=DatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true" 
}

5.Run 包 Nuget 管理器上的命令行:

PM>add-migration init
PM>update-database

Model

 public class Order     {
            public long Id { get; set; }
            public long CustomerId { get; set; }
            public DateTime OrderDateTime { get; set; }
            public virtual ICollection<OrderItem> OrderItems { get; set; }
      }

public class OrderItem

{  
    [Key]
    public int OrderItemId { get; set; }
    public string BookId { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal? Discount { get; set; }
    public decimal Total { get; set; }
    public long OrderId{get;set;} // ForeignKey OrderId
    [ForeignKey("OrderId")]
    public virtual Order Order { get; set; }

}

// 打开程序包管理器控制台

PM>add-migration "orderItem changed"
PM>update-database

您应该在订单实体中使用主键类型定义元数据 [ForeignKey]。之后 ef core 自动按您选择的名称在 db 中设置

public class Order 
{
    public long Id { get; set; }
    public long CustomerId { get; set; }
    public DateTime OrderDateTime { get; set; }

    public virtual ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem 
{
    public long Id { get; set; }    

    [ForeignKey(nameof(OrderId)]
    public virtual Order Order { get; set; }
    public long OrderId { get; set; }

    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal? Discount { get; set; }
    public decimal Total { get; set; }
}