2016-11-16 133 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"))));