2012-07-31 1 views
3

먼저 엔티티를 가져 오지 않고 LLBLGen을 사용하여 upmerge를하고 싶습니다.
엔티티를 먼저 가져 오지 않고 업데이트 할 수있는 가능성을 이미 발견했지만 이미 알고 있습니다.LLBLGen에서 Insert 또는 Update/Merge/Upsert를 수행하는 방법이 있습니까

업데이트 항목은 새 항목을 삽입하는 빈도만큼 자주 발생합니다.

한 번에 이렇게 할 수 있습니까?
한 단계로 처리하는 것이 합리적입니까?

현황 :

  • LLBLgen 프로 2.6
  • SQL 서버 2008 R2
  • .NET 3.5 SP1

답변

0

는 지금까지 내가 아는 한, 이것이 가능하지 않고, 수 없습니다 가능한.

페치되지 않은 엔티티에서 adapter.Save (entity)를 호출하려는 경우 프레임 워크는 새로운 것으로 가정합니다. 그것에 대해 생각한다면 프레임 워크가 UPDATE 문이나 INSERT 문을 내보낼 지 여부를 어떻게 알 수 있습니까? 무슨 일이 있어도 어딘가에 데이터베이스가 있는지 확인하여 행이 있는지 확인해야합니다.

단일 엔티티 (비 재귀 적) 저장을 위해 더 많거나 적은 자동으로 작성한 것을 작성하는 것은 그리 어렵지 않을 것입니다. 단계는 다음과 같습니다.

  1. 새 엔터티를 만들고 필드를 설정합니다. 약동학 또는 고유 제한 조건을 사용하여 동일한 유형의 엔티티를 가져 오기 위해
  2. 시도 (다른 옵션도 존재하지만, 균일으로 none)을 가져 오는 경우
  3. , 그냥 새로운 엔티티 (INSERT)
  4. 을 저장하지 실패
  5. 가져 오기가 성공하면 생성 된 엔티티의 필드를 가져온 엔티티의 필드에 매핑하십시오.
  6. 가져온 엔티티를 저장합니다 (UPDATE).
+1

정확히 일치합니다. 그리고 이것을 허용하는 DB 구조가 있습니다 (즉, 병합, 업서 트). 또한 : 수동으로 IsNew를 false로 설정하여 LLBLGen에 엔티티를 저장하면 먼저 가져 오지 않고 업데이트 할 수 있습니다. 다음 단계는 사용하기 쉽도록 업데이트하고, 그렇지 않으면 삽입하는 것이 매우 쉬울 것이라고 생각했습니다. – StampedeXV

1

LLBLGenPro로 작업 한 것을 기억하기 때문에 완전히 가능하며 그 아름다움 중 하나가 가능합니다! 내 샘플을 가지고 있지 않지만, 나는이처럼 사용할 수 있습니다 UpdateEntitiesDirectly라는 방법이 당신을 확신 :

// suppose we have Product and Order Entities 
using (var daa = new DataAccessAdapter()) 
{ 
    int numberOfUpdatedEntities = 
     daa.UpdateEntitiesDirectly(OrderFields.ProductId == 23 && OrderFields.Date > DateTime.Now.AddDays(-2)); 
} 

우리는 가능합니다 꽤 모든 것을 할 수 있었다 LLBLGenPro를 사용하여 ORM 프레임 워크는 훌륭합니다! DeleteEntitiesDirectly이라는 배치 삭제를 수행하는 방법도 있습니다.이 삭제 방법은 에티를 삭제하고 다른 것으로 대체해야하는 경우에 유용합니다.

희망이 있으면 도움이됩니다.

+0

안녕하세요. 나는이 방법을 안다. 문제는 업데이트 할 항목과 삽입 할 항목을 미리 모릅니다. 내가 먼저 그들을 가져와야한다는 것을 알기 위해 (나는 지금한다). – StampedeXV

+0

@StampedeXV 업데이트 할 엔티티를 모르는 경우 가져올 엔티티를 알 수 없습니다 !! – Ashkan

+0

또한이 방법은 Exist 엔티티 만 업데이트하고 새 엔티티는 삽입하지 않습니다. – Ashkan

1

EntityCollection을 사용하여 원하는 것을 얻을 수 있다고 생각합니다. 먼저 DataAccessAdapter의 FetchEntityCollection 메소드로 업데이트하려는 엔티티를 가져오고, 해당 콜렉션에서 원하는 것을 변경하고 새로운 엔티티를 삽입 한 다음 DataAccessAdapter, SaveCollection 메소드를 사용하여 저장하십시오. 이렇게하면 기존 엔티티가 업데이트되고 새 엔티티가 데이터베이스에 삽입됩니다.예를 들어 특정 제품의 주문을 조작하려는 제품 주문 시나리오에서 다음과 같이 사용할 수 있습니다.

int productId = 23; 
var orders = new EntityCollection<OrderEntity>(); 
using (DataAccessAdapter daa = new DataAccessAdapter()) 
{ 
    daa.FetchEntityCollection(orders, new RelationPredicateBucket(OrderFields.ProductId == productId)) 

    foreach(var order in orders) 
    { 
     order.State = 1; 
    } 

    OrderEntity newOrder = new OrderEntity(); 
    newOrder.ProductId == productId; 
    newOrder.State = 0; 
    orders.Add(newOrder); 

    daa.SaveEntityCollection(orders); 
} 
+0

그는 엔티티를 먼저 가져 오지 않고 ** 한 단계 **에서이 작업을 수행하려고합니다. 엔티티의 기본 키를 업데이트하도록 설정할 수 있습니까? – Ashkan

+0

한 단계에서 가능하다면 SQL 서버가 작동하지 않는다고 생각합니다. 그래서 LLBLGen의 방식도 아닙니다. – VahidNaderi

+0

가능한 한 한 단계로 처리하고 싶습니다. 비록 이것이 완벽하지 않더라도 SQL에서 (정확하게 기억한다면 MERGE 나 UPSERT와 같은) 이것을 할 수 있습니다. 나는 이미 당신이 제안한대로 그것을하고 있지만, 나는 그것을하는 더 좋은 방법을 찾고있었습니다. 답변을 주셔서 감사합니다! – StampedeXV

관련 문제