3

나는이 작동하지 않는 이유를 알아 내기 위해 노력하고 ...Entity Framework 코드 우선 : 데이터베이스에서 반환 된 엔티티 집합을 어떻게 캐스팅 할 수 있습니까?

DomainModel

public class ModelEntities : DbContext 
{ 
    public DbSet<Address> Addresses { get; set; } 
} 

컨트롤러

public ViewResult List(int id) 
{ 
    var db = new ModelEntities(); 
    var addresses = db.Addresses.Where(x => x.CustomerID == id).AsEnumerable(); 
    return View(entities.Cast<AddressVM>()); 
} 

보기

@model IEnumerable<WebUI.Models.AddressVM> 
... 
내가 IEnumerable<DomainModel.Models.Address>을 받아보기를 변경하지 않으면 예상대로 16,

AddressVM는

public class AddressVM 
{ 
    public AddressVM(Address address) { Bind(address); } 

    private void Bind(Address address) 
    { 
     // Mapping logic is defined here 
    } 

    public static explicit operator AddressVM(Address address) 
    { 
     return new AddressVM(address); 
    } 
} 

이제, 주조 모든 작동합니다.

내가 노력하고 내가 다음과 같은 오류 얻을 캐스트 할 왜 addresses 동적 프록시의 모음입니다도 AsEnumerable()를 호출 한 후 컨트롤러에서

Unable to cast object of type 'System.Data.Entity.DynamicProxies.Address_37444C79F0AB1E0A599C8797F37448F12213C5BCAC0611B4C1C8EFADDEFAA82C' to type 'WebUI.Models.AddressVM'.

를? 뷰 모델에 캐스트 할 수 있도록 내 도메인 모델 개체의 컬렉션을 가져 오려면 어떻게해야합니까?

+0

AddressVM 코드를 표시 할 수 있습니까? –

+2

왜 당신은 어쨌든 비 프록시 IP 주소를'캐스트'할 수 있다고 생각합니까? 프록시는 빨간 청어입니다. 진짜 문제는 호환되지 않는 유형을 캐스팅하려고한다는 것입니다. –

+0

음, 캐스팅을 수행 할 명시 적 연산자를 설정했습니다. 나는 간결함을 위해 그 코드를 포함시키지 않았지만 나는해야한다고 생각한다. 주소보기 모델에 대한 코드를 추가했습니다. 지금은 더 이해가 되니? 나는 Cast()에 대한 호출이 명시 적 연산자를 사용하여 컬렉션의 각 객체를 통해 열거하고 형변환한다는 가정하에있었습니다. –

답변

4

캐스팅의 개념에 대해 오해하실 것입니다. 캐스트 란 AddressVM 인스턴스가 Address 인스턴스라는 것을 의미합니다. 주소 개체에서 AddressVM 개체를 "변환하거나"인스턴스화해야 할 수도 있습니다. 이 시도 :

public ViewResult List(int id) 
{ 
    var db = new ModelEntities(); 
    var addresses = from a in db.Addresses.Where(x => x.CustomerID == id) 
        select new AddressVM(a); 
    return View(addresses); 
} 

[편집] 실제 유형과 목표 유형 사이의 암시 적 변환이있는 경우 Brian's answer에 따르면, 객체를 캐스팅 할 수 있습니다.

+0

+1, but ... L2E는 초기화 프로그램을 지원하지만 매개 변수화 된 생성자는 지원하지 않습니다. –

+0

감사합니다. 귀하의 방법은 효과가 있습니다. 그러나 왜 당신이 전화를 부탁 이해할 수 있습니다. 캐스트 () 않습니다? 주소를 AddressVM으로 변환하는 명시 적 연산자가 있습니다. Cast()를 호출하여 AddressVM의 새 IEnumerable을 만들고 각 주소 인스턴스에 명시 연산자를 호출하여 채우지 않아야합니까?각 AddressVM은 Address의 인스턴스에서 생성됩니다. –

+0

당신은 운영자의 코드를 게시 할 수 있습니까? –

2

Address을 전송하려면 AddressVMexplicit operator을 설정해야합니다. 도메인 모델에서 뷰 모델로 데이터를 쉽게 이동하려는 경우 AutoMapper를 살펴볼 수 있습니다.

+0

고맙지 만 이미 명시 적 연산자를 설정했습니다. 나는 간결함을 위해 그것을 포함하지 않았다. –

+0

+1은 Brian이 AutoMapper 사용을 제안한 것입니다. @Terminal Frost, 당신은 모든 것을 잘못하고 있습니다. 깨끗한 디자인을 따르십시오 : 도메인 모델을보기 모델과 분리하십시오. AutoMapper를 사용하여 둘 사이를 매핑하십시오. – Kassem