2012-07-31 57 views
3

我想先使用LLBLGen進行上竄,而不先取得然後保存實體。
我已經找到了更新的可能性,而不必先取得實體,但是我必須知道它已經存在。有什麼辦法可以在LLBLGen中插入或更新/合併/上傳

更新條目與插入新條目的頻率相同。

是否有可能一步完成此操作?
一步完成是否合理?

事實:

  • LLBLGEN Pro的2.6
  • SQL Server 2008 R2的
  • .NET 3.5 SP1

回答

0

據我所知,這是不可能的,也沒能得到可能。

如果您只是對未獲取的實體調用adapter.Save(實體),則框架會認爲它是新建的。如果你仔細想想,框架怎麼知道是發出UPDATE還是INSERT語句?無論如何,某處某處必須查詢數據庫以查看該行是否存在。

創建一些爲單個實體(非遞歸)保存或多或少自動執行此操作並不困難。步驟如下:

  1. 創建一個新的實體並設置它的字段。
  2. 嘗試使用的PK或唯一約束,以獲取相同類型的實體(也有其他選擇,但沒有作爲統一)
  3. 如果獲取失敗,只是保存新的實體(INSERT)
  4. 如果獲取成功,則將創建的實體的字段映射到獲取的實體的字段。
  5. 保存獲取的實體(UPDATE)。
+1

沒錯。還有DB構造允許這個(即合併,upsert)。另外:手動將IsNew設置爲false,將實體保存在LLBLGen中允許在不首先獲取的情況下進行更新。我認爲下一步將非常簡單,如果可用則更新,否則插入。 – StampedeXV 2012-08-01 06:14:31

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的批量刪除,在需要刪除一個etity並將其替換爲另一個eta的場景中可能有用。

希望這是有幫助的。

+0

嗨。我知道這種方法。問題是,我不知道要更新哪些項目以及要插入哪些項目。要知道我必須先取得他們(我現在所做的)。 – StampedeXV 2012-09-06 06:37:58

+0

@StampedeXV如果你不知道要更新哪些實體,那麼你不知道要獲取哪些實體! – Ashkan 2012-09-06 06:41:33

+0

此外,此方法僅更新存在的實體,它不會插入新的實體。 – Ashkan 2012-09-06 06:45:45

1

我想你可以通過使用EntityCollection來實現你要找的東西。首先通過DataAccessAdapter的FetchEntityCollection方法獲取要更新的實體,然後在該集合中更改任何您想要的內容,向其中插入新實體並使用DataAccessAdapter,SaveCollection方法保存它。這樣現有的實體將被更新並且新的實體將被插入到數據庫中。例如,在您想要操縱指定產品的訂單的產品訂單senario中,您可以使用類似如下的東西:

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 2012-09-07 09:13:35

+0

我不認爲如果一步就可能,它不是sql server的工作方式,所以也不是LLBLGen的方式。 – VahidNaderi 2012-09-07 10:13:26

+0

如果可能的話,我想一步完成。有可能在SQL中執行此操作(如果我沒有記錯,可以使用MERGE或UPSERT),即使它們不完美。我已經按照你的建議去做了,但我正在尋找一個更好的方法來做到這一點。儘管謝謝你的回答! – StampedeXV 2012-09-07 14:35:01

相關問題