Entity Framework 6 Code First function mapping

后端 未结 4 775
青春惊慌失措
青春惊慌失措 2020-12-05 13:18

I want integrate Entity Framework 6 to our system, but have problem.

  1. I want to use Code First. I don’t want to use Database First *.edmx file for other reasons
4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-05 14:18

    Here are all the steps needed [Tested] :

    Install-Package EntityFramework.CodeFirstStoreFunctions
    

    Declare a class for output result:

    public class MyCustomObject
    {
       [Key]
       public int Id { get; set; }
       public int Rank { get; set; }
    }
    

    Create a method in your DbContext class

    [DbFunction("MyContextType", "SearchSomething")]
    public virtual IQueryable SearchSomething(string keywords)
    {
       var keywordsParam = new ObjectParameter("keywords", typeof(string)) 
                               { 
                                  Value = keywords 
                                };
        return (this as IObjectContextAdapter).ObjectContext
        .CreateQuery(
         "MyContextType.SearchSomething(@keywords)", keywordsParam);
    }
    

    Add

    public DbSet SearchResults { get; set; }
    

    to your DbContext class

    Add in the overriden OnModelCreating method:

    modelBuilder.Conventions
    .Add(new CodeFirstStoreFunctions.FunctionsConvention("dbo"));
    

    And now you can call/join with a table values function like this:

    CREATE FUNCTION SearchSomething
    (   
        @keywords nvarchar(4000)
    )
    RETURNS TABLE 
    AS
    RETURN 
    (SELECT KEY_TBL.RANK AS Rank, Id
    FROM MyTable 
    LEFT JOIN freetexttable(MyTable , ([MyColumn1],[MyColumn2]), @keywords) AS KEY_TBL      
    ON MyTable.Id = KEY_TBL.[KEY]  
    WHERE KEY_TBL.RANK > 0   
    )
    GO
    

提交回复
热议问题