繁体   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