[英]Entity framework code first map stored procedures with composite primary keys
[英]Change naming convention of CUD stored procedures in entity framework code first
我對現有數據庫使用EF Code First(又名“ Code Second”)
許多對象將使用存儲過程進行CUD操作。 首先在代碼中,我可以這樣指定:
modelBuilder.Entity<Widget>
.MapToStoredProcedures()
這將假定存在名為Widget_Insert
, Widget_Update
和Widget_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.