2012-04-30 6 views
1

ASP.Net MVC3 EF4.1을 사용하는 프로젝트와 외래 키를 통한 테이블 간의 관계에서 작업하고 있습니다. 나는 데이터베이스 접근법을 사용하고 있으며 달력, 달력 사용자 및 사용자라는 세 개의 테이블을 가지고있다. 캘린더에는 많은 사용자가 있고 사용자는 많은 캘린더를 가질 수 있습니다.Mvc3 데이터베이스의 첫 번째 관계

누군가가 캘린더를 만들 때 캘린더에 액세스 할 수있는 사용자 수를 선택해야합니다. 하지만 지금은 내가 혼란 스러울 때 컨트롤러의 데이터베이스에 변경 사항을 저장하려고합니다. 생성 된 클래스에는 외래 키를 어떻게 든 나타내는 가상 ICollection이 있습니다. 하지만 어떻게 처리 할 수 ​​있을지 모르겠다. 어떻게 작동해야합니까? 가상 ICollections에 변경 사항을 추가 할 수 있어야하고 db.SaveChanges()를 수행하면됩니다. 그 자체로 작동하거나 수동으로 처리 할 수 ​​있습니까?

수동으로 처리해야한다면 사용자를 추가하고 일정을 추가 한 다음 CalendarUsers 테이블에 키를 추가하여 함께 바인딩해야합니까? OnModelCreating 메서드에 코드를 입력하여 관계를 명확히 한 코드의 예제를 처음 보았습니다.하지만 먼저 Database를 사용할 때는 throw new UnintentionalCodeFirstException();? 당신이 아마도 나를 위해 그것을 명확히 할 수 있길 바래요.

public partial class Calendar 
{ 
    public Calendar() 
    { 
     this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public int CalendarId { get; set; } 
    public string CalendarTitle { get; set; } 
    public string CalendarDescription { get; set; } 
    public long UserId { get; set; } 

    public virtual User User { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 

public partial class CalendarUser 
{ 
    public int CalendarUserId { get; set; } 
    public int CalendarId { get; set; } 
    public long UserId { get; set; } 
    public Nullable<bool> IsAdmin { get; set; } 

    public virtual Calendar Calendar { get; set; } 
    public virtual User User { get; set; } 
} 

public partial class User 
{ 
    public User() 
    { 
     this.Calendars = new HashSet<Calendar>(); 
     this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public long UserId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Calendar> Calendars { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 
+0

당신이 만든 클래스를 보여줄 수 다음 CalendarUser의 새 인스턴스 외부 키 속성을 설정하여 CalendarUser 기존의? (모든 세부 사항이 아니라 단지 클래스와 키와 외래 키 프로퍼티를 참조하는 프로퍼티입니다.) 중요한 질문은'CalendarUsers'를위한 별도의 클래스를 가지고 있거나 단지 (many-to-many 조인) 모델에 클래스가없는 테이블. – Slauma

+0

CalendarUsers는 별도의 클래스입니다. 어쩌면 좋은 방법이 아닐까요? – Janspeed

+0

'CalendarUser' 클래스는 OK입니다. IsAdmin 플래그 때문에 필요합니다. 좀 더 혼란스러운 것은'Calendar.User'와'User.Calendars' 사이에 추가적인 일대 다 관계가 있다는 것입니다. 왜 이걸 가지고 있니? 관계는 다 대다 (many-to-many) 관계이며 모델 ('Calendar.CalendarUsers' 및'User.CalendarUsers')에도 있습니다. 그러나이 추가적인 일대 다 관계의 목적은 무엇입니까? – Slauma

답변

0

당신은 단지 사이에 새로운 관계를 만들 수 있습니다 유사한 대다 관계에 업데이트를 처리 예제 코드의 경우, 가 강사로이 튜토리얼의 페이지 편집 섹션 코스 할당 추가를 참조하십시오

var newCalendarUser = new CalendarUser 
{ 
    CalendarId = calendarId, 
    UserId = userId, 
    IsAdmin = true // or false 
}; 
dbContext.CalendarUsers.Add(newCalendarUser); 
dbContext.SaveChanges(); 
+0

새 CalendarUser를 추가하려고하면 클래스에 빈 생성자가 없다는 메시지가 나타납니다. 그런 생성자를 추가 할 수는 있지만, 모델을 업데이트 할 때마다 생성자를 다시 만들어야합니다. 그게 내가 왜 그리워했다고 생각하는거야? 또한 그게 정말로 의미가 있는지 궁금해. 왜냐하면 그때 나는 모든 관계와 나올 모든 코딩을 추적해야 할 것입니다. 그런 다음 공개 가상 ICollection 의 목적은 무엇입니까? 많은 질문을해서 죄송합니다. 노력에 정말 감사드립니다. – Janspeed

+0

나는 다음과 같은 오류 얻을 : [MissingMethodException이 :.이 개체에 대해 정의 된 매개 변수가없는 생성자를] System.RuntimeTypeHandle.CreateInstance (RuntimeType이 형, 부울 publicOnly, 부울 NOCHECK, 부울 및 canBeCached, RuntimeMethodHandleInternal 및 ctor에, 부울 및 bNeedSecurityCheck) +0 System.RuntimeType .CreateInstanceSlow (부울 publicOnly, 부울 skipCheckThis, 부울 fillCache) +117 System.RuntimeType.CreateInstanceDefaultCtor (부울 publicOnly, 부울 skipVisibilityChecks, 부울 skipCheckThis, 부울 fillCache) +247 – Janspeed

+0

@Janspeed : 왜 CalendarUser에는 매개 변수없는 생성자가 없습니다 ? 위의 코드에서 'CalendarUser'에는 생성자가 전혀 없습니다 (즉, ** 기본적으로 ** 매개 변수없는 생성자를 가짐). 또는 다른 부분이나 this * partial * 클래스에 매개 변수가있는 생성자가 있습니까? 그렇다면 C#에 매개 변수가있는 생성자를 추가하면 기본 매개 변수가없는 생성자가 제거되므로 매개 변수없는 생성자를 수동으로 추가해야합니다 (빈 생성자 만). – Slauma

0

당신은 탐색 속성을 업데이트 할 수 있으며 EF 당신을위한 외래 키의 처리됩니다 :

는 아래의 DBcontext 생성기에 의해 생성 된 클래스를 추가했습니다.

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

매우 흥미로운 튜토리얼 이었지만 샘플을 다운로드했으며 OnModelCreating 메서드를 사용하여 관계를 매핑하므로 처음에는 데이터베이스로 작업 할 수 있다는 확신이 없으므로 혼란 스럽습니다.내가 여기에 핵심 지식을 놓치고있는 것처럼 느껴진다. 어쩌면 나는 먼저 데이터베이스를 버려야하고 코드로 먼저 이동해야하지만 그렇지 않 으면 좋겠습니까? – Janspeed

관련 문제