System.InvalidOperationException: The expression 'p.Email' is invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, use casting ('t => ((Derived)t).MyProperty') or the 'as' operator ('t => (t as Derived).MyProperty'). Collection navigation access can be filtered by composing Where, OrderBy(Descending), ThenBy(Descending), Skip or Take operations. For more information on including related data, see http://go.microsoft.com/fwlink/?LinkID=746393.
'Include' 에 대해서 내가 작성한 'p.Email' 이라는 사용은 유효하지 않다고 하네요
public MyUser? GetById(int id)
{
return _context.MyUsers
.Include(p => p.Id)
.Include(p => p.Email)
.Include(p => p.Name)
.SingleOrDefault(p => p.Id == id);
}
여기서 p라는 아이는 MyUser 객체이다.
Id, Email, Name은 MyUser 객체의 프로퍼티이다.
Include 함수를 잘못 이해하고 사용하고 있었다.
Include의 경우에 다른 테이블에 관계 맺은 게 있을 때 그걸 데려오려고 사용하는 것이다. (eager loading ) 이렇게 하지 않으면 EF Core에서 null을 띄운다. 참고
코드를 아래와 같이 수정한다.
public MyUser? GetById(int id)
{
return _context.MyUsers
.Include(p => p.Pwd)
.SingleOrDefault(p => p.Id == id);
}
이렇게 하면 위에서 의도한 바와는 달리 테이블의 전부를 response로 보여주게 된다.
나는 일단 리턴하는게 목적이라 ㄱㅊ... 만약에 내가 일부만 보여주고 싶다면, 일부 뷰모델을 만들어야 한다. 이쪽을 보시오
해당 링크에 친절한 설명이 있다.
You misunderstand. You can select into a new type called a projection. Otherwise the include is the type you defined which contains all the properties. You cannot change the type returned.
The LINQ docs are very good and should take a look.
머쓱
검색해보면, 이름을 잘못 써서 이 오류가 나는 경우가 종종 있다.