2016-07-20 6 views
2

MVC C# Entity Framework 응용 프로그램에 제너릭 컨트롤러를 만들려고합니다. DbSet < T> 및 T_Instance 라인 컴파일러 에러를 가지고 그러나C#. "유형 T는 매개 변수로 사용하기 위해 참조 유형이어야합니다." 방법?

public class GenericRecordController<T> : Controller 
{ 
    private DbSet<T> Table; 
    // ... 

    public action(){ 
     // ... 
     db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified; 
    } 
} 

.

유형 T

파라미터로 사용하기 위해 참조 유형이어야한다.

나는 그것이 해결되었다

Controller where T : class 

클래스를 위해 그것을 제약 조건합니다.

위의 오류는 무엇을 의미합니까?

해결책을 묻는 중입니다. 이 오류가 발생하는 이유와 클래스에 대한 제약 조건이 왜 해결되는지 이해하고 싶습니다.

+0

불완전하고 불분명 함. 또한, 논쟁의 여지가있는 디자인 선택. –

+0

@HenkHolterman. 왜 나쁜 디자인 선택입니까? –

+2

컨트롤러 지향 모델이므로 뷰 지향적이어야합니다. CRUD에는 불필요하며 다른 모든 목적에는 해가됩니다. –

답변

8

의 유형으로 공급 될 수있다 컴파일러를 알려줍니다

public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter 
where TEntity : class 

제네릭 형식이 class이어야하는 type constraint이 있으므로 다음과 같은 형식으로 초기화해야합니다.

public class GenericRecordController<T> : Controller where T : class 
{ ... } 
6

그들은 분명히 제네릭 형식에 대한 제약이 있습니다.

변경해야 모든

은 다음과 같습니다

public class GenericRecordController<T> : Controller where T : class 

이 당신이 Db<TEntity>의 정의를 보면 단지 참조 유형은 T.

관련 문제