0

예 :엔티티에 대한 특정 참여자로드 및 다른 엔티티에 대한 참조로 지정

새 송장을 입력하고 있습니다. 이 인보이스의 경우 고객을 입력해야합니다.

1) I 고객에 대한 모든 정보를 가지고 할 필요가 없습니다, 난 단지 아이디, 코드 및 이름

이 필요합니다 여기

var list = Context.Set<Customer>().ToList(); 

나는 두 가지 문제를 참조하십시오 우리는 고객의 목록을 검색한다고 가정하자

2) 현재 DbContext의 고객은 읽기 전용이므로 성능을 향상시키기 위해 DbContext에 상태를 모니터링하지 않도록 지시 할 수 있으면 좋을 것입니다.

질문 :

1) 우리는 (코드 울부 짖는 소리를 참조 고객에 대한 부분적인 데이터를로드,하지만 여전히 송장에 할당 할 수 있습니다)?

2) 수 우리는 변화를 위해 고객을 모니터링하고, 여전히 할 수 없을 DbContext 알려주기 :

당신이 원하는 것을 정확히을 할 수있는 직접적인 방법이 아니다
Invoice.Customer = CustomerList[10]; 

답변

2

을하지만 수 있습니다 일부 타협을 통해 목표를 달성 할 수 있습니다.

I 고객에 대한 모든 정보를 가져올 필요가 없습니다

, 난 단지 아이디, 코드와 이름이 필요

이 EF가 부분적으로로드 된 개체를 만들 수있는 방법이 아니지만, 당신은 할 수 새 익명 형식 살 수 있다면

Context.Customers.Select(c => new {Id = c.CustomerId, Code = c.Code, Name = c.Name}).Tolist() 

가 그를 사용하거나 다음 실제 고객 객체를 생성, 그 목록을 반복 수 : 익명의 유형을 만들 수 있습니다. 현재 DbContext에서

고객은 읽기 전용, 그래서 는, 자신의 상태를 모니터링 할 수 없습니다 DbContext에게 성능을 향상시킬 수 있다면 그것은 좋은 것입니다.

EF 당신을 위해 무엇을 찾고있는 정확하게 할 것입니다 AsNoTracking()의 확장 기능을 제공합니다

var list = Context.Set<Customer>().AsNoTracking().ToList(); 

위 선택 항목에 따라 다음과 같은 코드가 변경 될 수 있습니다,하지만이 코드는 무엇을 달성 않습니다 너 찾고있어. 고객을 부분적으로로드하지만 여전히 고객을 청구서에 첨부 할 수 있습니다.

참고 : 고객을 사용하기 전에 컨텍스트에 연결해야합니다. 그런 다음이를 변경되지 않은 상태로 설정하면 기존 데이터를 덮어 쓰지 않습니다.

 m = new Model(); 

     var list = m.Customers.Select(c => new {Id = c.CustomerId, Code = c.Code, Name = c.Name}); 

     List<Customer> customerList = new List<Customer>(); 
     foreach (var item in list) 
     { 
      customerList.Add(new Customer() 
       { 
        CustomerId = item.Id, 
        Code = item.Code, 
        Name = item.Name 
       }); 
     } 

     Invoice i = new Invoice(); 
     var customer = customerList.First(); 
     m.Customers.Attach(customer); 
     m.Entry(customer).State = EntityState.Unchanged; 

     i.Customer = customer; 

     m.Invoices.Add(i); 
     m.SaveChanges(); 
관련 문제