2016-08-04 2 views
3

현재 데이터베이스 공급자로 npgsql을 사용하여 ASP.NET 코어 및 엔티티 프레임 워크 코어가있는 API를 개발 중입니다. 나는 두 개의 엔티티가 있고 그들은 일대일 관계가 있습니다. 문제는 "부모 컨트롤러"가 반환하는 JSON 결과에 하위 엔터티의 ID 만 포함하려는 것입니다. 나는 그러나 이것을 달성하는 방법에 대한 확실하지 않다엔티티 프레임 워크 코어의 관련 엔티티 ID 만 포함

public class Meal { 
    public int Id { get; set; } 

    public string Title { get; set; } 
    public string Description { get; set; } 

    public string UserId { get; set; } 
    public User User { get; set; } 

    public List<Picture> Pictures { get; set; } 

    public Meal() { 
     this.Pictures = new List<Pictures>(); 
    } 
} 

public class Picture { 
    public int Id { get; set; } 

    public int MealId { get; set; } 
    public Meal Meal { get; set; } 

    public byte[] full { get; set; } 
    public byte[] small { get; set; } 
} 

:

이들은

내 엔티티입니다.

public IActionResult Meals() { 
    var meal = this.context.Meals 
     .Include(m => m.Pictures.Select(p => p.Id)) 
     .First(); 

    return new JsonResult(meal); 
} 

이 그러나 InvalidOperationException이 예외 : 어제는 다음과 같이 제안 다른 SO 질문을 가로 질러왔다. 내 DbContext는 매우 기본이며, onModelConfiguring이 아닙니다.이 코드는 알고있는 한도 내에서 컨벤션을 따르고 있으며, 해당 유형의 DbSets가 두 개 있습니다. 외래 키도 데이터베이스에서 정확하며 다음과 같이 호출합니다.

var pictures = dbContext.Pictures.Where(p => p.MealId == mealId).ToList(); 

예상대로 작동합니다. 내가 관련 있다고 생각하는 코드 만 포함 시켰습니다. 더 많이 필요하다면 포함 시키겠다.하지만 이것은 완전히 나의 질문에 대한 제한된 이해라고 생각한다.

감사합니다.

답변

1

은 하나 개의 옵션과 같이이다 그러나 나 자신에게 더 직관적 인 것처럼 보입니다. 그것은 당신의 선택입니다.

+0

완벽 해 보입니다. 나는 그것을 다시 바꿀 것이고 내일 이것을 시도 할 것이다. 고맙습니다! – larzz11

+0

시원하고, 어떻게 작동하는지 알려주세요. 다른 사람의 답변으로 표시하도록 도와 준다면, 다른 사람의 시간을 낭비하지 않도록 덧글을 달아주세요. –

0

.Include(m => m.Pictures.Select(p => p.Id))

.Include(m => m.Pictures) 

을 할 필요가 작동하지 않습니다 그리고 이것은 (모든 속성 아이디, MealId ..와)과 당신이 할 수있는 클라이언트 측에서 당신을 위해 당신에게 전체 그림 모델의 배열을 얻을 것이다 이드를 선택하십시오 ..

0

아마 거기에는 더 좋은 대답이있을 수 있지만, 어떻게 고쳐야할까요? Picture 클래스 전체를 포함하는 것은 바이너리 데이터도 포함될 것이기 때문에 옵션이 아니 었습니다. 데이터베이스를 비싼 호출로 사용하기 때문에 서버를 사용하지 않고 데이터를 쿼리하려고하지 않았습니다.

그래서 내가 한 것은 PictureFile (더 나은 이름을 생각할 필요가 있지만, 단지 File은 분명히 옵션이 아님)라는 이진 데이터를 넣었습니다. 클래스 PictureFile에는 해당 그림에 대한 참조와 그림 데이터가있는 바이트 배열이 있습니다. 그렇게하면 실제 파일을 가져 오지 않고 PicturesMeal에 넣을 수 있습니다. 클라이언트는 나중에 필요한 사진을 결정하고 PictureId에 의해 요청할 수 있습니다. 그런 일에

 var db = this.context; 
     var result = (from meal in db.Meals 
         where meal.<whatever> == "123" 
         select new 
         { 
         Id = meal.Id, 
         Title = meal.Title, 
         Description = meal.Description, 
         //other required meal properties here. 
         PictureIds = meal.Pictures.Select(x => x.Id) 
         }).ToList(); 

당신은 "선택"방법을 사용하여뿐만 아니라 람다를 통해 같은 일을 할 수 Linq에 : 당신은 당신의 DB 구조를 변경할 필요가 없습니다