我在我的项目中使用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; }
}
答案 0 :(得分:-1)
为什么不使用EF后门,使用stright-up ADO.NET,SQL Command对象和datareader?
使用Entity-SQL
时,您将看到与数据库的连接https://msdn.microsoft.com/en-us/library/vstudio/bb738684%28v=vs.100%29.aspx