簡體   English   中英

首先在實體框架代碼中更改CUD存儲過程的命名約定

[英]Change naming convention of CUD stored procedures in entity framework code first

我對現有數據庫使用EF Code First(又名“ Code Second”)

許多對象將使用存儲過程進行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我的存儲過程命名約定是什么,因此我不必為要使用它們的每個類顯式聲明每個存儲過程名稱?

若要更改存儲過程的命名約定,請執行以下操作:

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"))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM