2016-11-16 135 views
0

我使用EF代碼首先對現有的數據庫(a.k.a「守則二」)命名的CUD存儲過程約定變化實體框架代碼首先

許多對象將使用存儲的CUD操作的程序。在代碼首先我可以指定這樣的:

modelBuilder.Entity<Widget> 
    .MapToStoredProcedures() 

這將承擔命名爲Widget_InsertWidget_UpdateWidget_Delete有存儲過程。

如果我想使用不同的名字,我可以這樣做:

modelBuilder.Entity<Widget> 
    .MapToStoredProcedures(s => s.Insert(i => i.HasName("pr_Widget_Merge")) 
           .Update(u => u.HasName("pr_Widget_Merge")) 
           .Delete(d => .HasName("pr_Widget_Delete"))); 

我的問題是,使用自定義規範,有沒有辦法告訴EF什麼我的存儲過程的命名約定,所以我不要」我不得不爲每個我想要使用它們的類明確聲明每個存儲過程名稱?

回答

1

若要更改存儲過程的命名規則,你做的東西像下面這樣:

modelBuilder.Types().Configure(c => c.MapToStoredProcedures(p => p.Update(u => u.HasName("pr_" + c.ClrType.Name + "_Merge")))); 
modelBuilder.Types().Configure(c => c.MapToStoredProcedures(p => p.Insert(i => i.HasName("pr_" + c.ClrType.Name + "_Merge")))); 
modelBuilder.Types().Configure(c => c.MapToStoredProcedures(p => p.Delete(d => d.HasName("pr_" + c.ClrType.Name + "_Delete")))); 

有了這個,所有的實體將被映射到您指定的命名約定的存儲過程。

假設您不希望所有的實體映射到存儲過程。您可以創建一個接口並在您想要映射到存儲過程的實體上實現它。

public interface IMapToProcs {} 

然後,將該接口添加到要存儲過程映射的實體。現在

public class Widget : IMapToProcs 

,在你的DbContext實現你可以這樣做:

modelBuilder.Types().Where(t => t.IsInstanceOfType(typeof(IMapToProcs))).Configure(c => c.MapToStoredProcedures(p => p.Update(u => u.HasName("pr_" + c.ClrType.Name + "_Merge")))); 
    modelBuilder.Types().Where(t => t.IsInstanceOfType(typeof(IMapToProcs))).Configure(c => c.MapToStoredProcedures(p => p.Insert(i => i.HasName("pr_" + c.ClrType.Name + "_Merge")))); 
    modelBuilder.Types().Where(t => t.IsInstanceOfType(typeof(IMapToProcs))).Configure(c => c.MapToStoredProcedures(p => p.Delete(d => d.HasName("pr_" + c.ClrType.Name + "_Delete")))); 

最後,這可以減少到一條線:

modelBuilder.Types().Where(t => t.IsInstanceOfType(typeof(IMapToProcs))) 
     .Configure(c => c.MapToStoredProcedures(p => p.Update(u => u.HasName("pr_" + c.ClrType.Name + "_Merge")) 
                 .Insert(i => i.HasName("pr_" + c.ClrType.Name + "_Merge")) 
                 .Delete(d => d.HasName("pr_" + c.ClrType.Name + "_Delete"))));