C# EF使用context.Database.SqlQuery

C# EF使用context.Database.SqlQuery,c#,entity-framework,C#,Entity Framework,我在我的项目中使用EF6。在我想跳出通用领域entityframework世界之前,一切都很好 我想使用一个定制的sql来返回给定表中的列。SQL在SSMS中可以正常工作,如果我只想返回一个字符串列,它可以正常工作,如(1)所示 当我尝试返回许多列并将它们映射到实体类时,问题就开始了,如(2)所示 首先,它抱怨外键关系(延迟加载?),所以我通过调用构建它们的存储库来伪造它们。那就好了。(我有一个数据集实体,它有3个子实体) 现在我发现错误“指定的架构无效。错误: CLR类型到EDM类型的映射不明

我在我的项目中使用EF6。在我想跳出通用领域entityframework世界之前,一切都很好

我想使用一个定制的sql来返回给定表中的列。SQL在SSMS中可以正常工作,如果我只想返回一个字符串列,它可以正常工作,如(1)所示

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

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

现在我发现错误“指定的架构无效。错误: CLR类型到EDM类型的映射不明确,因为多个CLR类型与EDM类型“Dataset”匹配。以前找到的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; }
}
public List GetColumnsForTable(字符串tableName)
{
var returnStrings=新列表();
var returnObjects=new List();
//(1) 这个很好用
变量查询2=
“从TestMetaAdmin.INFORMATION_SCHEMA.COLUMNS中选择列_NAME,其中表_NAME=””+
tableName+“'”;
使用(var context=newtestMetaAdminEntities())
{
returnStrings=context.Database.SqlQuery(query2.ToList();
}
//完(一)
//(2) 这并不重要
变量查询=
“从TestMetaAdmin.INFORMATION\u SCHEMA.COLUMNS中选择列\u NAME,可为\u null,数据类型,字符\u最大长度,其中表\u NAME=””+
tableName+“'”;
使用(var context=newtestMetaAdminEntities())
{
var datasetRepo=新的datasetRepo();
var dummy=datasetRepo.GetAll();
returnObjects=context.Database.SqlQuery(query.ToList();
}
//完(二)
归还物品;
}
公共类模式
{
公共字符串列_NAME{get;set;}
公共布尔可为_null{get;set;}
公共字符串数据类型{get;set;}
公共整数字符\最大\长度{get;set;}
}

为什么不使用EF后门、stright up ADO.NET、SQL命令对象和datareader

当使用实体SQL时,您将看到与数据库的连接


您是否尝试过在EDMX文件中添加
SchemaItem
?我现在没有它,但是如果你右键点击它,你不能添加一个新的实体吗?类似于“代码优先”的实体,我从未亲自使用过。然后我必须将其映射到数据库中的某个东西。。。而且它是一个系统视图而不是用户表,所以它变得越来越复杂。。。我已经退出EF并在15分钟内写了一些东西,但我想进一步了解这一点(特别是如果您将它映射到一个字符串,它似乎不担心上下文的其余部分!?)检查它在哪一行失败。它看起来像您的
var datasetRepo=new datasetRepo()
var dummy=datasetRepo.GetAll()不被使用,因此可能会被删除。由于错误消息提到一个名为
Dataset
的不明确实体,我想知道它是否在这些行中的某一行上实际失败。您好,这些行工作正常。它们之所以存在,是因为它抱怨上下文中的fk关系(如果不存在)(这些行返回一个对象,该对象包含它抱怨不存在的三个外键)。。。这就是我不理解的——所有的错误都与上下文中的对象和关系有关。我正在尝试将它映射到一个单独的实体-这需要在上下文中吗?@Graemememiller我认为您可以在EDMX文件中创建一个实体,而不需要将DDL提交到数据库。