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

时间:2012-01-27 21:34:39

标签: c# .net entity-framework reflection stored-procedures

考虑我已经构建了DAL.dll,它是一个包含Entity Framework 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来查找type1作为ObjectContext类型。如何通过反映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 个答案:

答案 0 :(得分:2)

  1. 首先,您需要在实体模型中将存储过程导入Function。有关HowTo:http://ashishrocks.wordpress.com/2010/09/05/entity-framework-using-select-stored-procedures-for-entities-having-same-column-names/

  2. 的信息,请参阅此链接
  3. 在您执行此操作时,请确保为Function Import Name使用某种命名约定。例如,为所有存储过程函数导入添加前缀SP_

  4. 在您的实体模型中添加SP作为功能后,您应该可以在Model.Designer.cs中看到它们。编译更新的DAL。

  5. 现在您可以获得这样的存储过程:

    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();