0

저는 전통적인 방식에 익숙하기 때문에 Entity Framework 코드 우선 관계 생성을 이해하는 데 문제가 있습니다.엔티티 프레임 워크 - 관계 혼동

일대 다 관계가 분명해 보입니다. 하위 항목은 부모가 속한 부모를 나타내는 foreignKey ID 속성 만 있으면됩니다.

public class Parent 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 

    public int ParentId { get; set; } 
    public virtual Parent Parent { get; set; } 
} 

는 지금, 나는 제대로 대다 관계를 만드는 방법을 확실히 모르겠어요. 아마도 추가 테이블 ParentChild이 필요하므로 (외래 키) ID 속성이 필요하지 않을 수 있습니까?

public class Parent 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Parent> Parents { get; set; } 
} 

지금의 나는 단서가 없다 일대일 관계 . 공용 클래스 부모 { public int Id {get; 세트; }

public int ChildID { get; set; } public virtual Child child { get; set; } } public class Child { public int Id { get; set; } public int ParentId { get; set; } public virtual Parent Parent { get; set; } } 

외국 ID의 속성도 필요 또는 그냥 Child 클래스에서 Parent 클래스의 Child 속성과 Parent 타입 속성을 가질 수있다? 외래 키 ID 속성을 제외 할 때 virtual 키워드가 허용됩니까?

답변

0

엔티티 프레임 워크 유창한 API를 살펴 보시기 바랍니다. 유창한 API를 사용하면 일대일 관계를 쉽게 얻을 수 있습니다. Explanation source. 빠른 참조 :

public class Student 
    { 
     public Student() { } 

     public int StudentId { get; set; } 
     [Required] 
     public string StudentName { get; set; } 

     [Required] 
     public virtual StudentAddress StudentAddress { get; set; } 

    } 


    public class StudentAddress 
    { 
     [Key, ForeignKey("Student")] 
     public int StudentId { get; set; } 

     public string Address1 { get; set; } 
     public string Address2 { get; set; } 
     public string City { get; set; } 
     public int Zipcode { get; set; } 
     public string State { get; set; } 
     public string Country { get; set; } 

     public virtual Student Student { get; set; } 
    } 

datacontext 클래스에서 OnModelCreating을 재정의 할 수 있습니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<StudentAddress>() 
      .HasKey(e => e.StudentId); 
     modelBuilder.Entity<StudentAddress>() 
        .Property(e => e.StudentId) 
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     modelBuilder.Entity<StudentAddress>() 
        .HasRequired(e => e.Student) 
        .WithRequiredDependent(s => s.StudentAddress); 

     base.OnModelCreating(modelBuilder); 
    } 
0

Entity Framework를 사용하면 외래 키 관계를 모델에서 추론하고 이에 따라 테이블을 만들지 않아도됩니다. 실제로 수행해야하는 유일한 관계 유형은 0..1 또는 1에서 0..1 또는 1입니다.

데이터베이스 모델보다 객체 모델이 더 관대하다는 것을 잊지 마십시오. 오브젝트에는 콜렉션을 저장하지만 테이블에는 콜렉션을 저장하지 않는 특성을 가질 수 있습니다.

EF가 데이터베이스 수준에서 작업을 수행하고 개체 모델의 모든 속성 정의 (심지어는 컬렉션 속성)에 액세스 할 수 있으므로 다르게 생각해야합니다. 관계의 카디널리티는 0..1 또는 1, 당신의 속성과 다른 엔티티 객체에 대한 참조를 사용하는 경우

:

난 항상 그것을 완수하는 데 사용하는 규칙은 다음과 같다. 카디널리티가 많은 경우 컬렉션을 사용하십시오.

1 많은 (부모 당 많은 차일) : 여기

몇 가지 사용 사례입니다

public class Parent 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ICollection<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual Parent Parent { get; set; } 
} 

하나의 속성 (ID)와 가진 테이블 부모 될 데이터베이스의 결과 table 두 개의 특성을 가진 하위, Id 및 외래 키 특성이 자동으로 생성 된 Parent_Id (표 이름, 밑줄, 관련 클래스의 키 특성).

많은

많은 :

public class ClassA 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ICollection<ClassB> ClassBs { get; set; } 
} 

public class ClassB 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ICollection<ClassA> ClassAs { get; set; } 
} 

하나의 속성 (ID) 제 3 테이블 하나의 속성을 가진 표를 ClassA (ID), 테이블 ClassB가 될 데이터베이스에 결과합니다 (두 테이블 모두의이 ID)를 갖는 다 대 다 관계에 대한 관계 테이블.

EF는 직업을 수행하기 위해 필요한 것을 추론하여 더 구체적 일 필요가 없습니다. 유일한 다소 문제가 하나 이제

1 일에 :
public class ClassA 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ClassB ClassB { get; set; } 
} 

public class ClassB 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ClassA ClassA { get; set; } 
} 

내가 처음에 준 규칙에 따라, 이것은 우리가 할 것 인 것이다. 그러나이 경우 EF는 관계의 방향을 알 수있는 방법이 없습니다. 1 대 1의 우상은 어느 방향이든 상관 없습니다. 어노테이션을 사용하여 방향을 알려야합니다 (Fluent API와 비교하여 가장 쉬운 방법). ClassB가있는

public class ClassA 
{ 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ClassB ClassB { get; set; } 
} 

public class ClassB 
{ 
    [ForeignKey("ClassA")] 
    public int Id { get; set; } 
    // Navigation property 
    public virtual ClassA ClassA { get; set; } 
} 

주석 [외래 키 ("를 ClassA")는, EF는를 ClassA에서 ClassB가 외부 키로부터 ID 열을 사용하여 말한다.

데이터베이스의 결과는 두 개의 속성 (Id 및 ClassB_Id)이있는 테이블 ClassA와 단일 속성 (Id)이있는 ClassB 테이블이됩니다.

EF가 스스로 수행 할 수 있도록 foreigh 키 속성을 직접 만들지 않아도됩니다.

관련 문제