我的客户一直在使用 ADO.NET,现在想迁移到 EF。我开始怀疑他的限制是否会阻止它。(尽管我对 EF 的相对较新可能会阻止它。)
以下是约束:
- 我可能不会更改数据库。
- 我不能更改太多代码(只替换数据层)这里的重要一点是,几乎他所有的表单都有一个自动生成列的数据网格(你会在小样本中看到我的意思)
- (其他我可能忘记了)
他使用 SQL 来更改列名。我想没问题,我会用投影来做同样的事情。我写了一个简单的例子来说明发生了什么。
SqlConnection MyConnection = new SqlConnection(Properties.Settings.Default.TestConnectionString);
MyConnection.Open();
string SQLString = "Select fName as \"First Name\", lName as \"Sur Name\", lName as \"Last Name\", Age from Test";
SqlDataAdapter MyAdapter = new SqlDataAdapter(SQLString, MyConnection);
DataSet MySet = new DataSet("table");
MyAdapter.Fill(MySet);
bindingSource1.DataSource = MySet.Tables[0];
dataGridView1.AutoGenerateColumns = true;
bindingSource1.ResetBindings(true);
这是我的代码
var MyContext = new TestEntities();
var MyQuery = MyContext.Tests.Select(
test => new
{
FirstName = test.fName,
SurName = test.lName,
LastName = test.lName,
Age = test.Age
});
bindingSource2.DataSource = MyQuery.ToList();
dataGridView2.AutoGenerateColumns = true;
bindingSource2.ResetBindings(true);
到目前为止,一切都很好。不是他所做的精确复制(我的列中没有空格),但他对此很好。
但随后,他基于双击数据网格做出决策。所以他会想做这样的事情。
private void dataGridView2_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
Test MyTest = bindingSource2.Current as Test;
if (MyTest.Age > 50)
MessageBox.Show("You are old!");
}
投影创建匿名类型,所以我不能在这里做出那种决定。(请注意,我必须更改代码才能执行此操作 - 他当前的代码根据数据网格行中的数据做出选择,但他现在认为我们需要使用类。)
有没有办法用实体做到这一点?