2013-10-20 2 views
2

ASP.NET MVC에서 Entity Framework와의 일대 다 관계를 어떻게 표현합니까?Entity Framework와 일대 다 관계를 어떻게 표현합니까?

내 프로젝트는 전화 회의 프로젝트입니다. 데이터베이스가 Conferences입니다. 각 가상 Conference 객실에는 Title, OwnerName 및 다른 DialInNumbers 목록이 있습니다. 이 관계를 과 DialInNumbers 사이의 관계로 만들려면 적어도 두 개의 테이블이 필요합니다. 하나는 Conferences이고 다른 하나는 DialInNumbers입니다. DialInNumbers을 생성, 수정 및 액세스하는 데 문제가 발생했습니다. 내 코드는 확실히 뭔가를 놓친다. 이제 살펴 보자 다음 Controller에서,

public class Conference 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string OwnerName { get; set; } 
    public List<string> DialInNumbers { get; set; } 
} 

이 모델은 DbContext (... 정말 왜 확실하지)

public class ConferenceDbContext : DbContext 
{ 
    public DbSet<Conference> Conferences { get; set; } 
} 

다음이 필요합니다 여기

하면 Conference의 모델입니다 (ConferenceController), CreateEditConference입니다. 예를 들면 : 나는 데이터베이스 변경 사항을 저장하면

public ActionResult Create(Conference conference) 
{ 
    if (ModelState.IsValid) 
    { 
     conference.DialInNumbers = ThreeRandomlyGeneratedPhoneNumbers(); 

     db.Conferences.Add(conference); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(conference); 
} 

, 난 단지 Conferences에 대한 하나 개의 테이블을 얻을. 여러 테이블을 얻는 방법과 Entity Framework에서이 테이블을 함께 연결하는 방법은 무엇입니까?

감사합니다.

+0

코드를 먼저 작성 하시겠습니까? http://msdn.microsoft.com/en-us/data/jj591620.aspx –

+0

참조 http://stackoverflow.com/questions/8317749/entity-framework-code-first-liststring-property-mapping – haim770

답변

4

엔티티와 문자열 사이에 1 : N 관계를 정의 할 수 없습니다. EF에서는 두 엔티티 간의 관계 만 가능하므로 DialInNumber는 엔티티로 나타내야합니다.

public class DialInNumber { 
    public int ID { get; set; } 
    public string Number { get; set; } 
    public virtual Conference Conference { get; set;} 
} 

Conference 클래스는 문자열 컬렉션 대신 이러한 엔터티의 컬렉션을 참조해야합니다.

public class Conference { 
    public string Title { get; set; } 
    public string OwnerName { get; set; } 
    public virtual ICollection<DialInNumber> DialInNumbers { get; set; }  
} 

그리고 메모

는 : 게으른 로딩 작업을하기 위해, DialInNumbers 속성은 가상

+0

Brilliant! 이 작동합니다. 정말 고마워. 질문 :'Conference'와'DialInNumbers'의'virtual' 속성은 왜 지연로드에 필요합니까? – theLearningChan

+0

디자인 상 필요합니다. 이것이 프레임 워크가 EF로 컨텐트를 수정할 수있는 방법입니다. –

+1

EF는 프록시 클래스 개념을 사용합니다. DB에서 엔티티를 요청하면 클래스의 인스턴스를 만들지 않지만 변경 추적, 지연로드 등을 처리하는 프록시 클래스를 만듭니다. 프록시 클래스는 탐색 속성을 재정의해야하고 왜 가상 클래스 여야하는지. –

0
public class Conference 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string OwnerName { get; set; } 
    public List<string> DialInNumbers { get; set; } 
} 

귀하의 실체는 스칼라 속성을 가지고 있어야한다. 이는 다른 엔티티를 참조하지 않는다는 것을 의미합니다. 특정 경우 DialInNumbers 속성은 엔터티 목록이 아닌 문자열 목록입니다. Entity Framework는 탐색 속성을 현재 테이블 관계에 적용하지 않습니다.

DialInNumbers 테이블을 갖고 싶다면 DialNumber 목록이 있어야합니다.

public class Conference 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string OwnerName { get; set; } 
    public List<DialNumber> DialInNumbers { get; set; } 
} 

public Class DialNumber 
{ 
    public string Number{get;set;} 
    public int ConferenceId{get;set;} 
    public Conference Conference{get;set;} 
} 

구성 클래스의 탐색 속성에 대한 엔티티를 구성해야합니다.

modelBuilder 
    .Entity<DialNumber>() 
    .HasRequired(p => p.Conference); 

당신이 ID로 엔티티를 사용하려는 경우 당신이 당신에게 DialNumber을 수정해야합니다 : 이것은 당신이 나중에 실체를 부착 적은 오버 헤드를 가지고 할 수

public Class DialNumber 
{ 
    public string Number{get;set;} 
    public Conference Conference{get;set;} 
} 

modelBuilder 
    .Entity<DialNumber>() 
    .HasRequired(p => p.Conference); 
    .WithMany(b => b.DialNumber) 
    .HasForeignKey(p => p.ConferenceId); 

와 당신을 수 당신의 외래 키 (이 경우에는 ConferenceId)를 생성하는 기본 구문 대신 ConferenceId를 원하는 방식으로 지정하십시오.

관련 문제