2012-12-20 2 views
1

4 등급 내 클래스 객체를 디자인하십시오.엔티티 프레임 워크 MVC 내가 & 엔티티 프레임 워크 MVC에 새로 온 사람 4.</p> <p>ASP.Net MVC와 엔티티 프레임 워크 코드 첫 번째 데이터베이스를 구축을 위해 노력하고 내가하는 방법과 사투를 벌인거야 문제

public class Member 
    { 
     public virtual int MemberID { get; set; } 
     public virtual string Forename { get; set; } 
     public virtual string Surname { get; set; } 
     public virtual int age { get; set; } 
     public virtual AddressInformation Address { get; set; } 
     public virtual string EmailAddress { get; set; } 
     public virtual string HomePhoneNumber { get; set; } 
     public virtual string MobileNumber { get; set; } 
    } 



public class AddressInformation 
    { 
     public virtual int MemberID { get; set; } 
     public virtual string HouseNoName { get; set; } 
     public virtual string StreetName { get; set; } 
     public virtual string Town { get; set; } 
     public virtual string County { get; set; } 
     public virtual string PostCode { get; set; } 
     public virtual string Country { get; set; } 
    } 

나는 또한 DbContext에서 상속 다른 클래스를 가지고있다 - -이 :

은 내가 AddressInformation 클래스의 데이터 속성이 다음 것과 같은 멤버 클래스를 원하는

public class CentralDataStore :DbContext 
    { 
     public DbSet<Member> Members { get; set; } 
     public DbSet<AddressInformation> AddressInfo { get; set; } 
    } 

컨트롤러를 추가하면 AddressInformation을 입력 할 수 없으며 멤버 정보 만 내 View에 채워집니다.

누구나 가장 좋은 방법을 제안 할 수 있습니까? 내가 말했듯이 MVC를 처음 사용합니다.

+0

공개 가상 int ID {get; 세트; } Addressinformtion 클래스에? –

답변

2

당신은 가상 사용자의 모든 속성을 할 필요가 없습니다 만 사람이 사용 :이 그래서 난 내 자신을 썼다 좋아하지 않았다 항해. 그리고 Fluency API를 사용하여 Member와 AddressInformation 사이의 관계를 설정해야합니다. 기본 키를 지정하려면 기본 키의 이름을 Id로 지정하거나 속성 또는 Fluency API를 사용해야합니다. 또한 회원을 AddressInformation에 매핑하기위한 ID가 누락되었습니다. 다음은 클래스 정의가 어떻게 생겼는지입니다.

public class Member 
{ 
    public int ID { get; set; } 
    public string Forename { get; set; } 
    public string Surname { get; set; } 
    public int age { get; set; } 
    public virtual int AddressId { get; set; } 
    public virtual AddressInformation Address { get; set; } 
    public string EmailAddress { get; set; } 
    public string HomePhoneNumber { get; set; } 
    public string MobileNumber { get; set; } 
} 

public class AddressInformation 
{ 
    public int ID { get; set; } 
    public string HouseNoName { get; set; } 
    public string StreetName { get; set; } 
    public string Town { get; set; } 
    public string County { get; set; } 
    public string PostCode { get; set; } 
    public string Country { get; set; } 
} 

참고 AddressInformation 개체/테이블에 매핑을 제공하기 위해 AddressId 속성을 추가했습니다. Fluency API에서 이러한 관계를 이와 같이 구성하십시오.

public class MemberConfig : EntityTypeConfiguration<Member> 
{ 
    internal MemberConfig() 
    { 
     this.HasKey(m => m.ID); 
     this.HasRequired(m => m.Address) 
      .WithRequiredDependent(a => a.ID) 
      .HasForeignKey(m => m.AddressId); 

    } 
} 

외부 키 관계를 설정하면 EF가 자동으로 AddresssInformation을 Member 개체에로드합니다.

+0

감사합니다. 훌륭한 설명입니다. – Derek

2

보기를 생성하기위한 표준 템플릿이 중첩 된 개체의 입력 필드를 구현하지 않는다는 것을 알고 있습니다. 그러나이 link과 같은 MVC 응용 프로그램의 표준 템플릿을 확장하는 옵션이 있습니다. T4 템플릿과 비슷한 경우 중첩 클래스에 대한 입력 필드 생성을 추가 할 수 있습니다.

2

당신은 엔티티 프레임 워크를 사용할 때 서로

받는 지적 탐색 특성을 가진 두 개의 개체가있을 때, 당신은 쉽게,

특히, 유래를 얻을 수있는이 템플릿을 사용하여주의해야합니다 default Object 템플릿은 무한 루프를 방지하기 위해 특정 심도로 재귀하는 것을 방지합니다.

/Views/Shared/object.cshtml

@model object 

@using System.Text; 
@using System.Data; 

@{ 
    ViewDataDictionary viewData = Html.ViewContext.ViewData; 
    TemplateInfo templateInfo = viewData.TemplateInfo; 
    ModelMetadata modelMetadata = viewData.ModelMetadata; 

    System.Text.StringBuilder builder = new StringBuilder(); 

    string result; 

    // DDB #224751 
    if (templateInfo.TemplateDepth > 2) 
    { 
    result = modelMetadata.Model == null ? modelMetadata.NullDisplayText 
             : modelMetadata.SimpleDisplayText; 
    } 

    foreach (ModelMetadata propertyMetadata in modelMetadata.Properties 
    .Where(pm => pm.ShowForEdit 
      && pm.ModelType != typeof(System.Data.EntityState) 
      && !templateInfo.Visited(pm))) 
    { 
     builder.Append(Html.Editor(propertyMetadata.PropertyName).ToHtmlString()); 
    } 

    result = builder.ToString(); 
} 

@Html.Raw(result) 
관련 문제