DbFunction"无法转换为LINQ to Entities存储表达式"

时间:2017-08-02 04:16:13

标签: c# linq sql-server-2012 entity-framework-4 entity-framework-6

我尝试使用linq to sql访问数据库功能。 Herer是我的SQL标量函数:

CREATE  FUNCTION    Echo(@text NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)       AS
BEGIN
   RETURN @text;
END;

我创建了一个名为EntityFunction的类来调用Sql Server中的函数:

    public static class EntityFunctions
    {
        [DbFunction("SqlServer", "Echo")]
        public static string Echo(string parameter)
        {
            throw new NotImplementedException();
        }
    }

这是我的DbContext:

    public class MainDbContext : DbContext
    {
        #region Properties

        /// <summary>
        /// List of accounts in database.
        /// </summary>
        public DbSet<Account> Accounts { get; set; }

        #endregion

        #region Constructor

        /// <summary>
        /// Initiate context with default settings.
        /// </summary>
        public MainDbContext() : base(nameof(MainDbContext))
        {

        }

        #endregion

        #region Methods

        /// <summary>
        /// Called when model is being created.
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
            base.OnModelCreating(modelBuilder);
        }

        #endregion
    }

一切似乎都很好,但是当我使用这段代码时:

        private static void Main(string[] args)
        {
            var context = new MainDbContext();
            var accounts = context.Accounts.Select(x => EntityFunctions.Echo(x.Email)).ToList();

        }

应用程序抛出了一个异常:指定的方法&#39; System.String Echo(System.String)&#39;在类型&#39; MySqlEntityFramework.Models.EntityFunctions&#39;无法转换为LINQ to Entities商店表达式

有人可以帮我解决这个问题吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

这是使它对我有用的修改。

在OnModelCreating()方法中,添加以下行:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // ...
        modelBuilder.Conventions.Add(new FunctionsConvention("dbo", this.GetType()));
    }

定义DbFunction存根时,请使用以下属性:

    [DbFunction("CodeFirstDatabaseSchema", "Echo")]
    public static string Echo(string text)
    {
        throw new NotSupportedException("Direct calls are not supported.");
    }

我从 this link

这是我执行的测试,以查看是否是您遇到的问题:如果我注释掉modelBuilder.Conventions.Add上面的行,则会收到与您收到的错误类似的错误消息。

System.NotSupportedException:无法将类型为“ try1.ExContext”的指定方法“ System.String Echo(System.String)”转换为LINQ to Entities存储表达式。