2014-10-20 4 views
2

OrmLite를 사용하여 POCO의 일부 열을 채우는 데 어려움이 있습니다. 나는 Dog, Bowl, DogBowl이라는 세 개의 테이블을 가지고 있습니다. DogBowl은 교차점 테이블이며 Dog and Bowl의 ID를 보유하고 있습니다.OrmLite 조인 된 테이블간에 여러 열 선택

Dogs 
    PK Id: int, not null 
    Breed: varchar(20), not null 
    Name: varchar(20), not null 

Bowls 
    PK Id: int, not null 
    Type: varchar(20), not null 
    Color: varchar(20), not null 

Dogs_Bowls 
    PK: DogId, not null 
    PK: BowlId, not null 

는 여기에 내가 이것은 내가 실행 해요 C# 코드입니다

public class Dog : IHasId<int> 
{ 
    [AutoIncrement] 
    public int Id { get; set; } 

    [Required] 
    public string Breed { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 


public class Bowl : IHasId<int> 
{ 
    [AutoIncrement] 
    public int Id { get; set; } 

    [Required] 
    public string Type { get; set; } 

    [Required] 
    public string Color { get; set; } 
} 


public class DogBowl 
{ 
    [Required] 
    public int DogId { get; set; } 

    [Required] 
    public int BowlId { get; set; } 

    [Ignore] 
    public string DogName { get;set; } 

    [Ignore] 
    public string BowlColor { get;set; } 
} 

를 매핑 한 포항 강판이다.

var dogBowl = db.Select<DogBowl>(db 
    .From<Dog>() 
    .Join<Dog, DogBowl>((d, db) => d.Id == db.DogId) 
    .Join<DogBowl, Bowl>((db, b) => db.BowlId == b.Id) 
    .Where<Dog>(d => d.Id == 5)) 
    .ToList(); 

내가 생산하길 원하는 SQL은 이것이다 :

select 
    db.DogId, 
    db.BowlId, 
    d.Name AS DogName, 
    b.Color as BowlColor 
from DogBowl db 
join dog d on db.DogId = d.Id 
join bowl b on db.BowlId = b.Id 
where d.Id = 5 

내 문제는 코드가 실행 후 DogBowl.DogName 및 DogBowl.BowlColor 속성이 null 있다는 것입니다. "연결된 테이블에서 여러 열 선택"섹션의 https://github.com/ServiceStack/ServiceStack.OrmLite에 제공된 지침을 사용하고 있지만 작동하지 않습니다. DogBowl.DogName 및 DogBowl.BowlColor 속성을 채우려면 어떻게합니까?

답변

4

생성 된 SQL이 정확할 수 있습니다. db.GetLastSql() 속성을 검사하여 실행 후 생성 된 SQL을 확인할 수 있습니다.

문제는 결과를 할당하여

db.Select<DogBowl> 

, 당신은 DogBowl 개체의 목록을 만드는 것입니다. DogBowl 등록 정보 DogName 및 BowlColor는 SQL 문에 해당 이름과 정확히 일치하는 필드가 없으므로 항상 널입니다. OrmLite는 마술처럼 거기에가는 것을 알아 내지 못합니다. 이름을 일치시켜야합니다. 당신이 개 보울에서 필드가 "평면"개체에 결과를 할당 할 경우

, 당신과 같이, 새로운 DTO를 정의하고 그 결과를 할당 할 수 있습니다 :

public class FullDogBowl 
{ 
    public int DogId { get; set; } 
    public int BowlId { get; set; } 
    public string Breed { get; set; } 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public string Color { get; set; } 
} 

var dogBowl = db.Select<FullDogBowl>(db 
    .From<Dog>() 
    .Join<Dog, DogBowl>((d, db) => d.Id == db.DogId) 
    .Join<DogBowl, Bowl>((db, b) => db.BowlId == b.Id) 
    .Where<Dog>(d => d.Id == 5)) 
    .ToList(); 

을 다른 방법으로, 당신이 알고있는 경우 정확히 사용하려는 SQL, 그냥 사용 :

string sql = @"select 
    db.DogId, 
    db.BowlId, 
    d.Name AS DogName, 
    b.Color as BowlColor 
from DogBowl db 
join dog d on db.DogId = d.Id 
join bowl b on db.BowlId = b.Id 
where d.Id = @dog_id "; 

var dogBowlList = db.SqlList<DogBowl>(sql, new { dog_id = 5, }); 
+0

OK : 지금 가진 인구가 결과 집합을 반환

public class DogBowl { [Required] public int DogId { get; set; } [Required] public int BowlId { get; set; } } public class DogBowlInfo { public int DogId { get; set; } public int BowlId { get; set; } public string DogName { get; set; } public string BowlColor { get; set; } } 

합니다. 나는 DogBowl poco를 재사용하여 다른 수업을 만들 필요가 없어졌습니다. 이제 Ignore 속성은 poco를 사용하여 필드 채우기를 완전히 무시합니다. DogId와 BowlId를 보유하기 위해 DogBowlJococo에 DogBowl poco의 이름을 바꾼 다음 DogId, BowlId, DogName 및 BowlColor 속성을 보유하는 DogBowl이라는 새로운 poco를 만들었습니다. – Halcyon

2

[Ignore] 완전히 그래서 당신의 접근 방식 속성을 무시 OrmLite을 알 수 있다는 라울의 대답에 추가하고 싶은 합병 POCO "보기"와 같은 테이블을 재-사용 실 거예요. 내가 대신 당신이 반환 원하는 모든 필드와 별도의 POCO에 결과 집합 POCO 아웃을 분할하는 것이 좋습니다 :이 말이

using (var db = OpenDbConnection()) 
{ 
    db.DropAndCreateTable<Dog>(); 
    db.DropAndCreateTable<Bowl>(); 
    db.DropAndCreateTable<DogBowl>(); 

    var dog = new Dog { Breed = "Breed", Name = "Name" }; 
    var bowl = new Bowl { Color = "Color", Type = "Type" }; 
    db.Save(dog); 
    db.Save(bowl); 
    db.Insert(new DogBowl { DogId = dog.Id, BowlId = bowl.Id }); 

    var dogBowl = db.Select<DogBowlInfo>(
     db.From<Dog>() 
      .Join<Dog, DogBowl>((d, b) => d.Id == b.DogId) 
      .Join<DogBowl, Bowl>((d, b) => d.BowlId == b.Id) 
      .Where<Dog>(d => d.Id == dog.Id)); 

    dogBowl.PrintDump(); 
}