The case against EntityDataSource
Why does Microsoft insist on developing the EntityDataSource? I really don’t see the benefit. It’s just adding bloat to Entity Framework, especially since most people are moving away from Web Forms in favor of MVC. It was never even a good idea in the first place. It’s supposed to make data binding easier, but it ends up causing many problems.
It’s difficult to debug
It works great when it works, but when it doesn’t work… Ugh. When it breaks, it’s nearly impossible to determine the problem without blindly Googling around and trying things until they work, which is terrible. I once had to use SQL Server Profiler to monitor queries to determine the sql it had generated so I could properly debug the issue.
You also can’t see the results being returned without viewing the output on the page. Manually binding allows you to view the IEnumerable returned and manipulate the results further, if necessary.
It forces data access logic in your views
If you want a list of all Users in your database then great, add an EDS and grab all of them. But what if you need to filter them? Forget about it. You have to add a Where property and manually write SQL yourself. Or use the <WhereParameters> property with a bunch of verbose filters:
<WhereParameters>
<asp:SessionParameter Name="Id" DbType="Int32" SessionField="Id" />
<asp:SessionParameter Name="Name" DbType="String" SessionField="Name" />
<asp:ControlParameter ControlID="txtCompany" DbType="String" DefaultValue="" Name="Company"
PropertyName="Company" />
</WhereParameters>
It’s a mess of text and it’s impossible to determine what you’re actually selecting. Compared to:
context.Tests.Where(t => t.Id = (int)Session["Id"]
&& t.Name = (string)Session["Name"]
&& t.Company = txtCompany.Text);
Much cleaner and much more readable.
This also forces data access to live in your views which is a violation of Separation of Concerns. Data access should live where it belongs – in the aptly named Data Access Layer.
It’s slow
As a quick example, I set up a page with an EntityDataSource selecting all columns from a table with 50,000 rows and putting them into a GridView. To compare, I also manually binded the GridView by selecting from the ObjectContext itself.
Here’s a sample of the code for the EDS:
<asp:EntityDataSource runat="server" ID="eds" ConnectionString="name=Test"
AutoGenerateWhereClause="True" DefaultContainerName="Test"
EntitySetName="Test" AutoSort="true" />
<asp:GridView runat="server" ID="gvEds" DataSourceID="eds" AllowPaging="True"></asp:GridView>
And the manual binding:
<asp:GridView runat="server" ID="gvNoEds" AllowPaging="true" PageSize="50"></asp:GridView>
var tests = context.Test.ToList();
gvNoEds.DataSource = tests;
gvNoEds.DataBind();
Results:
| Entity Data Source | Manual |
|---|---|
| 0.020342 seconds | 0.006623 seconds |
Sure, both are fast, but this shows that the EDS is an order of magnitude slower than the manual binding. In a situation where there are many concurrent users with a lot more on a page, it could be 0.1 seconds compared to 0.01 seconds which is a noticable difference.
撮影やイベントに使う商品は、見た目だけでなく、準備時間と使いやすさも考えて選びましょう。サイズやセット内容を確認する場合は、東方Project コスプレから候補を探せます。複数の商品を比較し、自分の用途、予算、使用環境に合うものを選ぶことが大切です。
La decisión inicial debería centrarse en el tipo de corte que resulta más cómodo. La información disponible resulta más completa si permite consultar la guía de tallas y el tipo de corte indicado. La comparación puede completarse con «» para comparar las descripciones y las imágenes disponibles cuando existan. En el control final, conviene verificar que el corte encaje con el uso previsto.
La decisión inicial debería centrarse en el tipo de corte que resulta más cómodo. La información disponible resulta más completa si permite consultar la guía de tallas y el tipo de corte indicado. La comparación puede completarse con «equipación de la selección de Colombia» para comparar las descripciones y las imágenes disponibles cuando existan. En el control final, conviene verificar que el corte encaje con el uso previsto.
Kill it with fire
I’m really not sure why Microsoft insists on continuously supporting EntityDataSource. I see a slow, outdated control helper that abstracts too much while adding a lot of complexity. Let it die.