我有一个针对EF的代码优先课程:
public partial class table_test
{
[Key]
public int pKey { get; set; }
[Required(AllowEmptyStrings = true)]
[StringLength(50)]
public string Name { get; set; }
}
和一个DbContext:
public class Test_Context : DbContext
{
public Test_Context()
: base("name=Conn")
{
}
public DbSet<table_test> table_test { get; set; }
}
我要查询该表中的一些数据:
var items = context.table_test.ToArray();
var items2 = context.Database.SqlQuery<table_test>("SELECT * FROM table_test").ToArray();
var items3 = context.Database.SqlQuery<table_test>("SELECT pKey FROM table_test").ToArray();
然后我得到一个错误:
数据读取器与指定的版本不兼容 'UnitTestProject1.table_test'。类型“名称”的成员不 在数据读取器中有一个具有相同名称的对应列。
原因是什么?
答案 0 :(得分:0)
如评论中的Tetsuya Yamamoto所示,仅拥有table_test
时,您就无法映射到"SELECT pKey FROM table_test"
类。
我不知道您数据库的内容,所以我只写一个一般性的答案 改变这个
pKey
进入
"SELECT pKey FROM table_test"
但是作为一般规则,您不应该在查询数据库时使用“ RAW字符串”在其之上添加抽象层,这样在您更改DTO中的属性名称时,便会更容易
答案 1 :(得分:0)
此行产生了异常,因为您仅选择了EF期望int n=sc.nextInt(); //sc is scanner
int a[]=new int[n];
for(int i=0;i<n;i++)
{
a[i]=sc.nextInt();
}
int count=0;
for(int i=0;i<n;i++)
{ for(int j=i+1;j<n;j++)
if(i+j==a[i]+a[j])
count++;
}
System.out.println(count);
内部的属性映射定义的两列,即table_test
和pKey
:
Name
如果只想选择var items3 = context.Database.SqlQuery<table_test>("SELECT pKey FROM table_test").ToArray();
,只需使用现有pKey
数组中的LINQ Select()
(注意:首先放置items2
)
using System.Linq;