programing

엔티티 프레임워크 동일한 테이블 다대다 관계

lastcode 2023. 8. 5. 10:17
반응형

엔티티 프레임워크 동일한 테이블 다대다 관계

저는 분명히 제품이 포함된 Products라는 테이블을 가지고 있습니다.하지만 저는 관련 제품을 만들어야 합니다.그래서 제가 한 것은 두 개의 PK가 있는 product_related라는 연결 테이블을 만드는 것이었습니다.제품.제품 테이블 및 관련 ID제품 테이블의 ID도 입력합니다.

저는 이미 EF를 사용하고 있고 다른 테이블에 모든 것을 설정했습니다.제품과 다음과 같은 관계를 만들려면 이 정보를 적절하게 추가해야 합니다.product.Products.Add(product object here)물론 여기 있습니다.productDB에서 가져온 제품 개체를 나타냅니다.db.Products.FirstOr....

어떻게 하면 제대로 할 수 있을까요? 같은 테이블에 많은 사람들이?

감사해요.

Database-First 접근방식으로 다대다 관계를 작성하려면 특정 규칙을 따르는 데이터베이스 스키마를 설정해야 합니다.

  • 작성Products열이 있는 테이블ProductID주요한 열쇠로서.
  • 작성ProductRelations열이 있는 테이블ProductID그리고 한 칸RelatedID및 두 열을 기본 키(키)로 표시합니다.
  • 테이블에 다른 열을 추가하지 마십시오.EF가 이 테이블을 다대다 관계의 링크 테이블로 인식할 수 있도록 하려면 두 개의 키 열이 테이블의 유일한 열이어야 합니다.
  • 두 테이블 사이에 두 개의 외부관계를 만듭니다.
    • 첫 번째 관계는 다음과 같습니다.Products기본 키 테이블로 사용할 수 있습니다.ProductID기본 키 및ProductRelations외부 키로만 된 테이블 - 외부 키로만 된 테이블
    • 두 번째 관계는 또한 다음과 같습니다.Products기본 키 테이블로 사용할 수 있습니다.ProductID기본 키 및ProductRelations외부 키로만 된 테이블 - 외부 키로만 된 테이블
  • 두 관계 중 첫 번째 관계에 대해 단계적 삭제를 사용합니다. 두 관계 모두에 대해 삭제할 수 없습니다.SQL Server에서는 여러 단계적 삭제 경로가 발생하므로 이를 허용하지 않습니다.)

이 두 테이블에서 도면요소 데이터 모델을 생성하면 도면요소 하나, 즉Product실체(또는 아마도)Products단일화를 비활성화하는 경우).링크 테이블ProductRelations실체로 노출되지 않을 것입니다.

Product엔티티에는 두 가지 탐색 속성이 있습니다.

public EntityCollection<Product> Products { get { ... } set { ... } }
public EntityCollection<Product> Products1 { get { ... } set { ... } }

이러한 탐색 컬렉션은 동일한 다대다 관계의 두 끝점입니다. (다대다 관계로 연결하려는 두 개의 다른 테이블이 있는 경우 테이블이라고 말합니다.A그리고.B 하나내비게이컬하나션렉션하(나▁one▁navigion▁(Bs는 엔티티에 있을 입니다.A 하나 (기타(타기▁and▁theAs는 엔티티에 있을 입니다.B하지만 두 참조에 두 탐색 은 모두 엔티티 그나두자사관 "체이참조"에.Product.)

다음과 같습니다: 속의의다같음습다니과미는두성다:▁the니같습ties▁of▁meaning▁are▁proper▁the▁two.Products된 제품이 ?Products1해당 제품을 참조하는 제품입니다.예:이 관계가 제품이 제조될 부품으로 다른 제품이 필요하고 "노트북", "프로세서", "실리콘 칩" 제품이 있는 경우 "프로세서"는 "실리콘 칩"으로 만들어집니다("실리콘 칩"은 "실리콘 칩"의 요소입니다).Products의집수의 Processor"노트북"에 의해 사용됩니다("노트북"은 다음의 요소입니다).Products1의집수의 Processor제품 엔티티).에 에.Products그리고.Products1 이들름▁namesMadeOf그리고.UsedBy그러면 더 적절할 것입니다.

관계의 한 쪽에만 관심이 있는 경우 생성된 모형에서 컬렉션 중 하나를 안전하게 삭제할 수 있습니다.예를 들어 삭제합니다.Products1모델 디자이너 표면에서.속성의 이름을 변경할 수도 있습니다.그 관계는 여전히 다대다일 것입니다.

편집

코멘트에서 질문한 바와 같이, 코드 우선 접근법을 사용한 모델과 매핑은 다음과 같습니다.

모델:

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

    public ICollection<Product> RelatedProducts { get; set; }
}

매핑:

public class MyContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>()
            .HasMany(p => RelatedProducts)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("ProductID");
                m.MapRightKey("RelatedID");
                m.ToTable("product_related");
            });
    }
}

예를 들어 보겠습니다.

관련표

  Related_id      PK
  Related_name
  Date

제품

  Product_id      PK
  Related_id      FK
  Product_Name
  Date

EF로 표현하는 방법

관련 모델로 명명된 관련 모델 클래스

  [Key]
  public int Related_id { get; set; }

  public string Related_name {get;set}

  public Datetime Date{get;set;}

제품 모델로 명명된 제품 모델 클래스

   [Key]
  public int Product_id { get; set; }

  public string Product_name {get;set}

  public string Related_id {get;set}

  public Datetime Date{get;set;}

  [ForeignKey("Related_id ")]      //We  can also specify here Foreign key
  public virtual RelatedModel Related { get; set; } 

이러한 방식으로 두 테이블 간의 관계를 만들 수 있습니다.

이제 많은 관계에서 다른 예를 들어보겠습니다.

모델 클래스가 있다고 가정합니다. Enrollment.cs

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public decimal? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

여기 과정ID와 StudentId는 두 개의 외부 키입니다.

이제 다대다 관계를 만들 또 다른 클래스 Course.cs 가 있습니다.

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public int Credits { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

이것이 도움이 되기를 바랍니다!!!

언급URL : https://stackoverflow.com/questions/12237617/entityframework-same-table-many-to-many-relationship

반응형