EF使用context.Database.SqlQuery

时间:2015-04-17 14:33:35

标签: c# entity-framework

我在我的项目中使用EF6。一切都很好,直到我想走出一般领域 - 实体框架世界。

我想使用自定义的sql位来返回给定表中的列。 SQL在SSMS中工作正常,如果我只想返回单个字符串列,这在(1)中工作正常。

当我尝试返回多个列并将它们映射到实体类时,问题就开始了,如(2)所示。

首先它抱怨外键关系(延迟加载?)所以我通过调用构建它们的存储库来伪造它们。那就是那个。 (我有一个有3个子实体的数据集实体)

现在我收到错误“指定的架构无效。错误: CLR类型到EDM类型的映射是不明确的,因为多个CLR类型与EDM类型“数据集”匹配。以前发现CLR类型'Meta.EF.Dataset',新发现的CLR类型'Meta.Entities.Dataset'。“

为什么在(2)中是否关心其余的背景及其关系?我只是想对数据库执行一段SQL?我没有要求它做这样的事情。我可以告诉它不要吗?

或者只是为了这种事情而离开EF?

由于

public List<SchemaItem> GetColumnsForTable(string tableName)
    {
        var returnStrings = new List<string>();
        var returnObjects = new List<SchemaItem>();

        //(1) THIS WORKS FINE
        var query2 =
           "SELECT COLUMN_NAME FROM TestMetaAdmin.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" +
           tableName + "'";

        using (var context = new TestMetaAdminEntities())
        {
            returnStrings = context.Database.SqlQuery<string>(query2).ToList();
        }
        //END (1)

        //(2) THIS DOESN'T
        var query =
            "SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM TestMetaAdmin.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" +
            tableName + "'";

        using (var context = new TestMetaAdminEntities())
        {
            var datasetRepo = new DatasetRepo();
            var dummy = datasetRepo.GetAll();

            returnObjects = context.Database.SqlQuery<SchemaItem>(query).ToList();
        }
        //END (2)

        return returnObjects;
    }


public class SchemaItem
{

    public string COLUMN_NAME { get; set; }
    public bool IS_NULLABLE { get; set; }
    public string DATA_TYPE { get; set; }
    public int CHARACTER_MAXIMUM_LENGTH { get; set; }
}

1 个答案:

答案 0 :(得分:-1)

为什么不使用EF后门,使用stright-up ADO.NET,SQL Command对象和datareader?

http://blogs.msdn.com/b/alexj/archive/2009/11/07/tip-41-how-to-execute-t-sql-directly-against-the-database.aspx

使用Entity-SQL

时,您将看到与数据库的连接

https://msdn.microsoft.com/en-us/library/vstudio/bb738684%28v=vs.100%29.aspx