📜  fluent api c# hasmany withmany - C# (1)

📅  最后修改于: 2023-12-03 15:30:47.758000             🧑  作者: Mango

使用 Fluent API 在 C# 中建立 HasMany WithMany 关系

在 Entity Framework 中,我们可以使用 Fluent API 来建立实体之间的关系。在本文中,我们将探讨如何使用 Fluent API 在 C# 中建立 HasMany WithMany 关系。

HasMany 和 WithMany

在 Entity Framework 中,HasMany 和 WithMany 是两种类型的关系:一对多关系和多对多关系。

HasMany 表示一个实体可以拥有多个关联实体。WithMany 表示多个实体可以关联到同一个实体。

建立一对多关系

要在 Fluent API 中建立一对多关系,我们需要在拥有多个实体的实体类型上使用 HasMany 方法,以及在拥有一个实体的实体类型上使用 WithOne 方法。

例如,我们有一个 Order 实体,它可以对应多个 OrderItem 实体。我们可以使用以下代码来建立 Order 和 OrderItem 之间的关系:

public class Order
{
    public int OrderId { get; set; }
    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int OrderItemId { get; set; }
    public int OrderId { get; set; }
    public Order Order { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .HasMany(o => o.OrderItems)
        .WithOne(i => i.Order)
        .HasForeignKey(i => i.OrderId);
}

在上述代码中,我们首先定义了 Order 和 OrderItem 实体类型。然后,在 OnModelCreating 方法中,我们使用 modelBuilder.Entity().HasMany(o => o.OrderItems) 方法来定义 Order 实体类型拥有多个 OrderItem 实体。接着,我们使用 .WithOne(i => i.Order) 方法来定义一个 OrderItem 实体只能对应一个 Order 实体,并使用 .HasForeignKey(i => i.OrderId) 方法来指定外键属性。

建立多对多关系

要在 Fluent API 中建立多对多关系,我们需要在两个实体类型上使用 HasMany 方法,并在中间表实体类型上使用 WithMany 方法。

例如,我们有一个 Student 实体和一个 Course 实体,一个学生可以选修多个课程,同时一个课程也可以被多个学生选修。我们可以使用以下代码来建立 Student 和 Course 之间的多对多关系:

public class Student
{
    public int StudentId { get; set; }
    public ICollection<StudentCourse> StudentCourses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public ICollection<StudentCourse> StudentCourses { get; set; }
}

public class StudentCourse
{
    public int StudentId { get; set; }
    public int CourseId { get; set; }
    public Student Student { get; set; }
    public Course Course { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<StudentCourse>()
        .HasKey(sc => new { sc.StudentId, sc.CourseId });

    modelBuilder.Entity<StudentCourse>()
        .HasOne(sc => sc.Student)
        .WithMany(s => s.StudentCourses)
        .HasForeignKey(sc => sc.StudentId);

    modelBuilder.Entity<StudentCourse>()
        .HasOne(sc => sc.Course)
        .WithMany(c => c.StudentCourses)
        .HasForeignKey(sc => sc.CourseId);
}

在上述代码中,我们首先定义了 Student 和 Course 实体类型,并定义了一个中间表实体类型 StudentCourse 。然后,在 OnModelCreating 方法中,我们使用 modelBuilder.Entity().HasKey(sc => new { sc.StudentId, sc.CourseId }) 方法来定义 StudentCourse 实体类型的主键。接着,我们使用 modelBuilder.Entity().HasOne(sc => sc.Student).WithMany(s => s.StudentCourses).HasForeignKey(sc => sc.StudentId) 方法来定义一个 StudentCourse 实体只能对应一个 Student 实体,并使用 .WithMany(c => c.StudentCourses) 方法来定义一个 Student 实体可以对应多个 StudentCourse 实体。同样,我们使用 modelBuilder.Entity().HasOne(sc => sc.Course).WithMany(c => c.StudentCourses).HasForeignKey(sc => sc.CourseId) 方法来定义一个 StudentCourse 实体只能对应一个 Course 实体,并使用 .WithMany(s => s.StudentCourses) 方法来定义一个课程可以对应多个 StudentCourse 实体。

结论

通过使用 Fluent API,我们可以轻松地在 Entity Framework 中建立 HasMany 和 WithMany 关系。你可以根据自己的情况使用上述方法,定义关系,以便更好地维护数据库。

Markdown 格式的源代码片段如下:

# 使用 Fluent API 在 C# 中建立 HasMany WithMany 关系

在 Entity Framework 中,我们可以使用 Fluent API 来建立实体之间的关系。在本文中,我们将探讨如何使用 Fluent API 在 C# 中建立 HasMany WithMany 关系。

## HasMany 和 WithMany

在 Entity Framework 中,HasMany 和 WithMany 是两种类型的关系:一对多关系和多对多关系。

HasMany 表示一个实体可以拥有多个关联实体。WithMany 表示多个实体可以关联到同一个实体。

## 建立一对多关系

要在 Fluent API 中建立一对多关系,我们需要在拥有多个实体的实体类型上使用 HasMany 方法,以及在拥有一个实体的实体类型上使用 WithOne 方法。

例如,我们有一个 Order 实体,它可以对应多个 OrderItem 实体。我们可以使用以下代码来建立 Order 和 OrderItem 之间的关系:

```csharp
public class Order
{
    public int OrderId { get; set; }
    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int OrderItemId { get; set; }
    public int OrderId { get; set; }
    public Order Order { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .HasMany(o => o.OrderItems)
        .WithOne(i => i.Order)
        .HasForeignKey(i => i.OrderId);
}

在上述代码中,我们首先定义了 Order 和 OrderItem 实体类型。然后,在 OnModelCreating 方法中,我们使用 modelBuilder.Entity().HasMany(o => o.OrderItems) 方法来定义 Order 实体类型拥有多个 OrderItem 实体。接着,我们使用 .WithOne(i => i.Order) 方法来定义一个 OrderItem 实体只能对应一个 Order 实体,并使用 .HasForeignKey(i => i.OrderId) 方法来指定外键属性。


## 建立多对多关系

要在 Fluent API 中建立多对多关系,我们需要在两个实体类型上使用 HasMany 方法,并在中间表实体类型上使用 WithMany 方法。

例如,我们有一个 Student 实体和一个 Course 实体,一个学生可以选修多个课程,同时一个课程也可以被多个学生选修。我们可以使用以下代码来建立 Student 和 Course 之间的多对多关系:

```csharp
public class Student
{
    public int StudentId { get; set; }
    public ICollection<StudentCourse> StudentCourses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public ICollection<StudentCourse> StudentCourses { get; set; }
}

public class StudentCourse
{
    public int StudentId { get; set; }
    public int CourseId { get; set; }
    public Student Student { get; set; }
    public Course Course { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<StudentCourse>()
        .HasKey(sc => new { sc.StudentId, sc.CourseId });

    modelBuilder.Entity<StudentCourse>()
        .HasOne(sc => sc.Student)
        .WithMany(s => s.StudentCourses)
        .HasForeignKey(sc => sc.StudentId);

    modelBuilder.Entity<StudentCourse>()
        .HasOne(sc => sc.Course)
        .WithMany(c => c.StudentCourses)
        .HasForeignKey(sc => sc.CourseId);
}

在上述代码中,我们首先定义了 Student 和 Course 实体类型,并定义了一个中间表实体类型 StudentCourse 。然后,在 OnModelCreating 方法中,我们使用 modelBuilder.Entity().HasKey(sc => new { sc.StudentId, sc.CourseId }) 方法来定义 StudentCourse 实体类型的主键。接着,我们使用 modelBuilder.Entity().HasOne(sc => sc.Student).WithMany(s => s.StudentCourses).HasForeignKey(sc => sc.StudentId) 方法来定义一个 StudentCourse 实体只能对应一个 Student 实体,并使用 .WithMany(c => c.StudentCourses) 方法来定义一个 Student 实体可以对应多个 StudentCourse 实体。同样,我们使用 modelBuilder.Entity().HasOne(sc => sc.Course).WithMany(c => c.StudentCourses).HasForeignKey(sc => sc.CourseId) 方法来定义一个 StudentCourse 实体只能对应一个 Course 实体,并使用 .WithMany(s => s.StudentCourses) 方法来定义一个课程可以对应多个 StudentCourse 实体。