使用反射从实体数据模型中获取存储过程名称

本文关键字:获取 存储过程 数据模型 反射 实体 | 更新日期: 2023-09-27 18:21:46

考虑我已经构建了DAL.dll,这是一个包含实体框架edmx的类库。在Designer.cs中,定义了以下导入的存储过程:

    <Function Name="Login_User" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
      <Parameter Name="Login_Name" Type="nvarchar" Mode="In" />
      <Parameter Name="Password" Type="nvarchar" Mode="In" />
      <Parameter Name="SP_Return_Code" Type="int" Mode="InOut" />
    </Function>

下面我使用Reflection找到了作为ObjectContext类型的type1。如何通过反射type1来发现Login_User存储过程?

    private static void ReflectionTest()
    {
        var asm = Assembly.LoadFrom(@"C:'DAL.dll");
        // list stored procedure calls
        foreach (var type in asm.GetTypes())
        {
            if (type.BaseType == typeof(ObjectContext))
            {
                foreach (var type1 in type.GetMethods())
                {
                    // how do I reflect against type1 for its stored procedure names?
                }
            }
        }
    }

使用反射从实体数据模型中获取存储过程名称

  1. 首先,您需要将存储过程作为Function导入实体模型中。请参阅此链接了解如何:http://ashishrocks.wordpress.com/2010/09/05/entity-framework-using-select-stored-procedures-for-entities-having-same-column-names/

  2. 在执行此操作时,请确保对Function Import Name使用某种命名约定。例如,将SP_作为所有存储过程函数导入的前缀。

  3. 将SP添加为实体模型中的函数后,您应该能够在Model.Designer.cs中看到它们。编译更新的DAL。

现在你可以得到这样的存储过程:

Assembly assembly = Assembly.LoadFrom(@"C:'DAL.dll");
foreach (MethodInfo methodInfo in from type in assembly.GetTypes()
                                  where type.BaseType == typeof (ObjectContext)
                                  from methodInfo in type.GetMethods()
                                  where methodInfo.Name.StartsWith("SP_")
                                  select methodInfo)
{
    Console.WriteLine(methodInfo.Name);
}
Console.ReadLine();