[英]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.