2014-06-11 2 views
0

.NET MVC 웹 사이트를 만들려고하고 있는데 엔티티 프레임 워크를 통해 데이터베이스의 관련 테이블을로드하고 저장하는 데 문제가 있습니다.Entity Framework를 사용하여 적절한 탐색 속성을 설정하는 방법은 무엇입니까?

1) 한 테이블에서 관련 엔터티에 액세스하려고하면 내 탐색 속성이 비어있는 것처럼 보입니다.

public class Table1 { 
    public int Table1ID { get; set; } 
    public string Name { get; set; } 
    [ForeignKey("Table2")] 
    public int Table2ID { get; set; } 
    [ForeignKey("Table2ID")] 
    public virtual Table2 Table2 { get; set; } 
} 

public class Table2 { 
    public int Table2ID { get; set; } 
    public string Name { get; set; } 
    public virtual Table1 Table1 { get; set; } 
} 

내 EF 컨텍스트 클래스에서이 같은 내 매핑이 :

public class EFDbContext : DbContext { 
    public DbSet<Table1> Table1 { get; set; } 
    public DbSet<Table2> Table2 { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.Entity<Table2>().HasOptional(u => u.Table1).WithRequired().WillCascadeOnDelete(true); 
    } 
} 

내 컨트롤러에서 내가 원하는 표 2의 인스턴스를 가져오고 내보기로 보내 :에서

public ViewResult Edit(int productId) { 
    Table2 Table2Instance = repository.Table2.FirstOrDefault(p => p.Table2ID == productId); 
    return View(Table2Instance); 
} 

내보기 나는 Table2Instance Table1 관계가 있는지 여부에 따라이 작업을 수행 할 필요가 있습니다.이 같은 시도 :

@model Entities.Table2 

@if (Model.Table1 == null && Model.Table2ID != 0){ 
    //Do this 
}else if (Model.Table1 != null && Model.Table2ID != 0) { 
    //Do that 
} 

하지만 데이터베이스에 관계가 있어도 항상 Model.Table1을 null로 표시하므로 내 탐색 속성이 제대로 작동하지 않는 것 같습니다. 이 탐색 속성은 어떻게 설정해야합니까?

2) Table1ID를 매번 0으로 저장하려고 시도하기 때문에 context.Table1.Add (Table1Instance)와 context.SaveChanges()를 사용하여 새 Table1 속성을 저장하려고하면 오류가 발생하며 증가하지 않습니다 ?

답변

2

관련 탐색 속성은 기본적으로 읽지 않습니다. 를 읽으려면 다음을 사용할 수 있습니다

  • 지연로드를 (그것이 bitmore 복잡)
  • 명시 적 로딩 (즉 Include 사용)
  • 열망로드 (즉 LazyLoading이 활성화되어있는 속성에 액세스)

    Table2 Table2Instance = repository 
        .Table2 
        .Include(t2 => t2.Table1) // add this to your query 
        .FirstOrDefault(p => p.Table2ID == productId); 
    
    : 귀하의 경우

    , 더 적절한 솔루션은 다음과 같이 이루어집니다 열망로드입니다

    두 번째 질문에 대해서는 더 많은 코드를 보여야합니다. 계층화 된 응용 프로그램에서 엔터티가 DbContext을 벗어나면 다시 첨부해야하고 SaveChanges을 호출하기 전에 엔터티 상태를 설정해야한다는 점을 알아야합니다.

  • +0

    나는 그것이 강력한 입력 한도'System.Data.Entity를 사용하여 필요 여기 예제를 포함하는 것이 주목할 가치가 있다고 생각;'. –

    +0

    컨트롤러에서, System.Data.Entity를 사용하고 있어도, 내 동작 메서드 내에서 .Include를 사용할 때 오류가 발생합니다. 편집? IEnumerable 에 포함 정의에 대한 내용이 없습니다. –

    +0

    매우 이상하게도 System.Data.Entity 네임 스페이스에있는 DbExtensions 클래스의 확장 메서드입니다. 저장소가 DbContext를 상속하는 클래스의 객체입니까?Table2 및 IQueryable 입니까? 파일에 DbExtensions를 입력하면 기존 클래스로 인식됩니까? – JotaBe

    0

    Table1ID를 매번 0으로 저장하려고하므로 증가하지 않으므로?

    당신은 ID 열로서 열 설정을 포함해야합니다

    modelBuilder.Entity<Table2>() 
        .HasOptional(u => u.Table1) 
        .WithRequired() 
        .WillCascadeOnDelete(true); 
    
    modelBuilder.Entity<Table2>() 
        .Property(x => x.Table2ID) 
        .StoreGeneratedPattern = StoreGeneratedPattern.Identity; 
    
    +0

    그 StreGeneratedPattern 그 맥락에서 존재하지 않습니다 –

    관련 문제