Использование Reflection для получения имени хранимой процедуры из Entity Data Model. - PullRequest
1 голос
/ 28 января 2012

Учтите, что я создал DAL.dll - библиотеку классов, содержащую Entm 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.Как мне найти хранимую процедуру Login_User, отражая type1?

    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 Ответ

2 голосов
/ 28 января 2012
  1. Сначала вам нужно будет импортировать хранимые процедуры как Function в вашей модели Entity.Обратитесь к этой ссылке, чтобы узнать, как: 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 в качестве функций в вашей Entity Model, вы сможете увидеть их в вашем 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...