2014-09-25 47 views
1

在linq to sql中,通過對dbml文件創建一個部分類,然後插入一個部分方法來製作一個「觸發器」。這是一個不會做任何事情的例子,因爲它調用了內置刪除。你如何在Linq中觸發實體?

partial void DeleteMyTable(MyTable instance) 
{ 
    //custom code here 
    ExecuteDynamicDelete(instance); 
    //or here :-) 
} 

但是,你如何做一個「觸發器」在LINQ實體?

+0

Linq僅用於檢索數據,在Linq中沒有等價的數據庫觸發器。您可以編寫一些代碼,在每次創建/更新/刪除特定實體時執行某些操作,但這與Linq無關。 – 2014-09-25 09:26:58

+0

我從來沒有談論linq,我提到兩個框架名稱爲「linq to sql」和「linq to entities」,兩個框架都處理數據存儲。如果它被包裝在odata服務或其他東西中,我也會感興趣。 (只要它是開箱即用的)。 – 2014-09-25 11:28:22

+0

ORM框架稱爲實體框架,Linq to Entities僅僅是實體框架的Linq提供者。 – 2014-09-25 11:33:36

回答

0

您可以查看一些可覆蓋的方法,例如SaveChanges,您可以在實體到達數據庫之前對它們進行調整。

這裏有一個例子直接從一些代碼,我們在店裏,我們確保一個ReadOnlyContext不寫什麼到DB:

public class ReadOnlyEntities : Entities 
{ 
    public bool EnforceReadonlyBehavior { get; set; } 


    public ReadOnlyEntities(string connectionString) 
     : base(connectionString) 
    { 
     EnforceReadonlyBehavior = true; 
    } 

    public override int SaveChanges(System.Data.Objects.SaveOptions options) 
    { 
     if (EnforceReadonlyBehavior) 
     { 
      if (
       ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Any() 
       || 
       ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified).Any() 
       || 
       ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted).Any() 
       ) 
      { 
       throw new InvalidOperationException("nope"); 
      } 
     } 
     return base.SaveChanges(options); 
    } 
} 

這可以讓你做很多有趣的事情,如自動設置一些值(創建日期/修改日期)。您還可以在OnContextCreated中創建上下文,您可以在其中設置所有類型的特定行爲。

實體本身也有一些局部方法。看看edmx後面的reference.cs文件中生成的內容,找到可以在數據訪問層中鉤住某些行爲的位置

正如Ben Robinson指出的那樣,這與linq無關,而與生成的代碼在實體框架或LINQ到SQL。

+0

在這個例子中,獲取實例不是很困難。由於SaveChanges可以改變一百萬張不同的表格,而且我的計劃是做一些接近數據庫觸發器的東西,但是在代碼中。在我的「linq to sql」示例中,我做了一個刪除觸發器,但它也用於插入和編輯。 – 2014-09-25 11:35:05

+1

是的,它是最高級別的,但正如我所說的,在實體級別有一些方法可以幫助你,但是你不會在Linq中創建1-1映射到SQL – samy 2014-09-25 11:39:55

+0

好吧,我想那就是答案。然後,我將鉤入SaveChanges之前的更具體的代碼。 – 2014-09-25 11:48:58