<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//az//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2013 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2013.5.16</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Sun, 05 Jul 2009 13:00:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//az//</link></image><item><title>Button con disabilitazione dello stesso dopo il click</title><link>http://blogs.aspitalia.com/az/post2518/Button-Disabilitazione-Click.aspx</link><pubDate>Sun, 05 Jul 2009 13:00:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2518" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Innanzitutto, si tratta di un tradizionale &lt;em&gt;Button &lt;/em&gt;che al click si disabilita, ma in grado anche di controllare la presenza di &lt;em&gt;Validator &lt;/em&gt;nella pagina. Avevo trovato il &lt;a href="http://www.codeproject.com/KB/custom-controls/ClickOnce_Button_Control.aspx" title="Link esterno"&gt;codice&lt;/a&gt; di questo &lt;em&gt;webcontrol &lt;/em&gt;un po' di tempo fa.
L'avevo utilizzato in un mio progetto personale e non mi aveva mai dato
problemi fino a oggi, quando mi sono scontrato sulla sua inefficacia in
caso di &lt;em&gt;ValidationGroup&lt;/em&gt;. Armato di pazienza ecco che mi sono preso in mano il codice ed ho eseguito le modifiche del caso. Forse può essere utile ad altri, ed ecco il codice completo:&lt;/p&gt;&lt;code&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.HtmlControls;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Drawing;&lt;br /&gt;namespace AZWebControls&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; [ToolboxBitmap(typeof(System.Web.UI.WebControls.Button)), DefaultEvent(&amp;quot;Click&amp;quot;), DefaultProperty(&amp;quot;Text&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class ClickOnceButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler, IButtonControl&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public event EventHandler Click;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public event System.Web.UI.WebControls.CommandEventHandler Command;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; private string OnceClickBtnName = &amp;quot;__onceClickBtn&amp;quot;;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(true), Category(&amp;quot;Behavior&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public bool DisableAfterClick&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; object o = base.ViewState[&amp;quot;DisableAfterClick&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return ((o == null) ? false : (bool)o);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set { base.ViewState[&amp;quot;DisableAfterClick&amp;quot;] = value; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(true), Category(&amp;quot;Behavior&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string CommandName&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; object o = base.ViewState[&amp;quot;CommandName&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return ((o == null) ? string.Empty : (string)o);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set { base.ViewState[&amp;quot;CommandName&amp;quot;] = value; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(true), Category(&amp;quot;Behavior&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string CommandArgument&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; object o = base.ViewState[&amp;quot;CommandArgument&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return ((o == null) ? string.Empty : (string)o);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set { base.ViewState[&amp;quot;CommandArgument&amp;quot;] = value; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(true), Category(&amp;quot;Appearance&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string DisabledText&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; object o = base.ViewState[&amp;quot;DisabledText&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return ((o == null) ? string.Empty : (string)o);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set { base.ViewState[&amp;quot;DisabledText&amp;quot;] = value; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(true), Category(&amp;quot;Appearance&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string Text&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; object o = base.ViewState[&amp;quot;Text&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return ((o == null) ? &amp;quot;Button&amp;quot; : (string)o);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set { base.ViewState[&amp;quot;Text&amp;quot;] = value; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(true), Category(&amp;quot;Behavior&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public bool CausesValidation&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; object o = base.ViewState[&amp;quot;CausesValidation&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return ((o == null) ? true : (bool)o);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set { base.ViewState[&amp;quot;CausesValidation&amp;quot;] = value; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public ClickOnceButton()&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; : base(HtmlTextWriterTag.Input)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(false)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; internal string GetClientValidateEvent&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (string.IsNullOrEmpty(this.ValidationGroup))&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return &amp;quot;if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); &amp;quot;;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; else&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return &amp;quot;if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate('&amp;quot;+this.ValidationGroup+&amp;quot;'); &amp;quot;;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(false)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; internal string GetClickOnceClientValidateEvent&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (string.IsNullOrEmpty(this.ValidationGroup))&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return &amp;quot;if (typeof(Page_ClientValidate) == 'function') { if(Page_ClientValidate()) { &amp;quot; + GetOnceClickJavascript + &amp;quot; }} else { &amp;quot; + GetOnceClickJavascript + &amp;quot; }&amp;quot;;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; else&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return &amp;quot;if (typeof(Page_ClientValidate) == 'function') { if(Page_ClientValidate('&amp;quot;+this.ValidationGroup+&amp;quot;')) { &amp;quot; + GetOnceClickJavascript + &amp;quot; }} else { &amp;quot; + GetOnceClickJavascript + &amp;quot; }&amp;quot;;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [Browsable(false)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; internal string GetOnceClickJavascript&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get { return &amp;quot;document.getElementsByName('&amp;quot; + this.OnceClickBtnName + &amp;quot;').item(0).setAttribute('name',&amp;quot; + &amp;quot;this.getAttribute('name')); this.disabled = true; &amp;quot; + (DisabledText == string.Empty ? string.Empty : &amp;quot;this.value = '&amp;quot; + DisabledText + &amp;quot;';&amp;quot;) + &amp;quot;this.form.submit();&amp;quot;; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; protected override void RenderContents(HtmlTextWriter writer)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; protected override void AddAttributesToRender(HtmlTextWriter writer)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; string strOnClick;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if ((base.Page == null))&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.Page.VerifyRenderingInServerForm(this);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(HtmlTextWriterAttribute.Type, &amp;quot;submit&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(HtmlTextWriterAttribute.Name, base.UniqueID);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Text);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if ((base.Page != null) &amp;amp; this.CausesValidation &amp;amp; base.Page.Validators.Count &amp;gt; 0)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (this.DisableAfterClick)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; strOnClick = this.GetClickOnceClientValidateEvent;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; else&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; strOnClick = this.GetClientValidateEvent;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (base.Attributes.Count &amp;gt; 0 &amp;amp; (base.Attributes[&amp;quot;onclick&amp;quot;] != null))&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; strOnClick = string.Concat(base.Attributes[&amp;quot;onclick&amp;quot;], strOnClick);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.Attributes.Remove(&amp;quot;onclick&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(&amp;quot;language&amp;quot;, &amp;quot;javascript&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; else if (DisableAfterClick == true)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; strOnClick = GetOnceClickJavascript;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (base.Attributes.Count &amp;gt; 0 &amp;amp; (base.Attributes[&amp;quot;onclick&amp;quot;] != null))&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; strOnClick = string.Concat(base.Attributes[&amp;quot;onclick&amp;quot;], strOnClick);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.Attributes.Remove(&amp;quot;onclick&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(&amp;quot;language&amp;quot;, &amp;quot;javascript&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.AddAttributesToRender(writer);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; protected override void OnInit(EventArgs e)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (DisableAfterClick &amp;amp;&amp;amp; !IsHiddenFieldRegistered())&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.Page.ClientScript.RegisterHiddenField(this.OnceClickBtnName, &amp;quot;&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; //base.Page.RegisterHiddenField(this.OnceClickBtnName, &amp;quot;&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.OnInit(e);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; private bool IsHiddenFieldRegistered()&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; foreach (Control ctl in base.Page.Controls)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (ctl is HtmlInputHidden)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (ctl.ID == this.OnceClickBtnName)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return true;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return false;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; protected virtual void OnClick(EventArgs e)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (Click != null)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Click(this, e);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; protected virtual void OnCommand(System.Web.UI.WebControls.CommandEventArgs e)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (Command != null)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Command(this, e);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (this.CausesValidation)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; base.Page.Validate();&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; this.OnClick(new EventArgs());&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; this.OnCommand(new System.Web.UI.WebControls.CommandEventArgs(this.CommandName, this.CommandArgument));&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; #region IButtonControl Members&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [UrlProperty(&amp;quot;*.aspx&amp;quot;), Editor(&amp;quot;System.Web.UI.Design.UrlEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;, typeof(System.Drawing.Design.UITypeEditor)), Themeable(false), DefaultValue(&amp;quot;&amp;quot;)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public virtual string PostBackUrl&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; string str = (string)this.ViewState[&amp;quot;PostBackUrl&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (str != null)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return str;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return string.Empty;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; this.ViewState[&amp;quot;PostBackUrl&amp;quot;] = value;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; [DefaultValue(&amp;quot;&amp;quot;), Themeable(false)]&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public virtual string ValidationGroup&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; get&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; string str = (string)this.ViewState[&amp;quot;ValidationGroup&amp;quot;];&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; if (str != null)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return str;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return string.Empty;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; set&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; this.ViewState[&amp;quot;ValidationGroup&amp;quot;] = value;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; #endregion&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Custom_Control/" rel="tag"&gt;Custom Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2518/Button-Disabilitazione-Click.aspx"&gt;&lt;em&gt;Button con disabilitazione dello stesso dopo il click&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, ASP.NET, Custom Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2518/Button-Disabilitazione-Click.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2518/Button-Disabilitazione-Click.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2518.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2518</trackback:ping></item><item><title>Triplet class non &amp;#232; un oggetto curioso, &amp;#232; utilissimo!!!</title><link>http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx</link><pubDate>Fri, 12 Sep 2008 15:11:08 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2386" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Esiste dalla versione 1.0 del Framework. Lo ritendo &lt;strike&gt;l'oggetto più curioso all'interno dello stesso &lt;/strike&gt;un oggetto utilissimo per l'uso del viewstate e la creazione dei custom control così come spiegano nei commenti Cristian e Daniele.&lt;/p&gt; &lt;p&gt;Accetta tre parametri object. Esempio da &lt;a title="link esterno" href="http://msdn.microsoft.com/it-it/library/system.web.ui.triplet.aspx"&gt;MSDN&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Triplet circle = new Triplet(5, 7, 3); &lt;br /&gt;lblCircle.Text = &amp;quot;X position: &amp;quot; + circle.First + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;lt;br /&amp;gt;Y position: &amp;quot; + circle.Second + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;lt;br /&amp;gt;Radius: &amp;quot; + circle.Third; &lt;br /&gt; &lt;br /&gt;Triplet labels = new Triplet(Label1, Label2, Label3); &lt;br /&gt;Label1.Text = &amp;quot;Type: &amp;quot; + labels.First.GetType().ToString(); &lt;br /&gt;Label2.Text = &amp;quot;ToString: &amp;quot; + labels.Second.ToString(); &lt;br /&gt;Label3.Text = &amp;quot;HashCode: &amp;quot; + labels.Third.GetHashCode(); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strike&gt;Sono basito.&lt;/strike&gt;&lt;/p&gt; &lt;p&gt;&lt;strike&gt;Essendo venerdì un po' di leggerezza, no?&lt;/strike&gt;&lt;/p&gt; &lt;p&gt;Blog modificato per evitare il linciaggio! :)&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx"&gt;&lt;em&gt;Triplet class non &amp;amp;egrave; un oggetto curioso, &amp;amp;egrave; utilissimo!!!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx</guid><slash:comments>13</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2386.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2386</trackback:ping></item><item><title>Entity Framework e stranezze(*)</title><link>http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx</link><pubDate>Fri, 12 Sep 2008 07:11:33 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2385" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;em&gt;Entity&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img height="200" alt="entity" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkestranezze_8108/entity_3.gif" width="394" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;// Step 1 &lt;br /&gt;var coll2 = (from c in context.Men.Include(&amp;quot;Women&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c).First(); &lt;br /&gt;&lt;/em&gt;// &lt;br /&gt;// Visualizza item; &lt;br /&gt;//---------------------------------------------------------------- &lt;br /&gt;// &lt;br /&gt;// Step 2 &lt;br /&gt;// &lt;br /&gt;&lt;em&gt;coll2.Age++; &lt;br /&gt;coll2.Women.Age++; &lt;br /&gt;// &lt;br /&gt;// Visualizza item; &lt;br /&gt;//----------------------------------------------------------------- &lt;br /&gt;// &lt;br /&gt;// Step 3 &lt;br /&gt;// &lt;br /&gt;var coll3 = from c in context.Men.Include(&amp;quot;Women&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c; &lt;br /&gt;foreach (var item in coll3) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visualizza item; &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Nel primo caso come age della prima &lt;em&gt;entity&lt;/em&gt; e della seconda, viene visualizzato il contenuto iniziale della tabella (viene eseguita la query visibile grazie al profiler):&lt;/p&gt; &lt;p&gt;&lt;em&gt;1 e 1&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Al secondo step viene visualizzato:&lt;/p&gt; &lt;p&gt;&lt;em&gt;2 e 2&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Domanda finale... Che cosa viene visualizzato allo step 3? Do un aiuto, con il profiler è visibile la query di select delle due &lt;em&gt;entity&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Dunque?&lt;/p&gt; &lt;p&gt;Qual è la risposta?&lt;/p&gt; &lt;p&gt;Sto aspettando...&lt;/p&gt; &lt;p&gt;Be', si potrebbe pensare che visualizzi ancora 1 e 1 visto che esegue richiede le due tabella al database che ritornano i valori iniziali (proprio ciò che avviene), ma invece viene visualizzato:&lt;/p&gt; &lt;p&gt;&lt;em&gt;2 e 2!!!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma perché esegue la query se alla finfine prende ancora i dati aggiornati in precedenza?&lt;/p&gt; &lt;p&gt;Un attimo di pensieri alterni...&lt;/p&gt; &lt;p&gt;Giungo alla conclusione che esegue queste query con controllare la consistenza dei dati, per vedere se eventualmente il record sul db è stato modificato da qualcosa d'altro. Anzi, oso di più, mi convinco che sia questo il motivo.&lt;/p&gt; &lt;p&gt;Avvio il profiler e l'enterprise manager.&lt;/p&gt; &lt;p&gt;Eseguo i due step, blocco, modifico il record esternamente, e eseguo l'ultimo passo. La query viene eseguita e presi i dati... ma non accade nulla!!! Nulla di nulla!&lt;/p&gt; &lt;p&gt;Non mi arrendo. Modifico le proprietà delle due &lt;em&gt;entity&lt;/em&gt;. Imposto &lt;em&gt;Age&lt;/em&gt; come &lt;em&gt;Concurrency Mode&lt;/em&gt; a &lt;em&gt;Fixed&lt;/em&gt;. Riprovo. Non cambia nulla... uff... Per avere aggiornati i dati dobbiamo &lt;em&gt;forzare&lt;/em&gt; la cosa:&lt;/p&gt; &lt;p&gt;&lt;em&gt;// &lt;br /&gt;// Step 3 &lt;br /&gt;// &lt;br /&gt;var coll3 = from c in context.Men.Include(&amp;quot;Women&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c; &lt;br /&gt;foreach (var item in coll3) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item.Women); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visualizzo dati &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Buono a sapersi, ma perché la query non la fa in questo caso e solo questo?&lt;/p&gt; &lt;p&gt;(*) La parola &lt;em&gt;strano&lt;/em&gt;, che vuol dì? Qualcosa che non è normale, qualcosa al di fuori di ogni schema? Ma in sé, che significa? E' una prola senza significato. Cos'è &lt;em&gt;strano&lt;/em&gt;? Ciò che fuori dal normale senso civico e comportamentale? Chi ha creato l'&lt;em&gt;Entity Framework &lt;/em&gt;saprà dirmi il perché di questo comportamento che riterrà normale... dunque è strano ciò che penso io! &lt;em&gt;Strano&lt;/em&gt; è una parola inutile, da cancellare. Che parola odiosa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx"&gt;&lt;em&gt;Entity Framework e stranezze(*)&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx</guid><slash:comments>6</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2385.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2385</trackback:ping></item><item><title>Entity Framework. Una tabella due Entity senza discriminazioni</title><link>http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx</link><pubDate>Sat, 06 Sep 2008 08:52:04 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2383" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un &lt;a href="http://blogs.aspitalia.com/az/post2377/entity-framework-ereditarieta-single-table-inheritance.aspx"&gt;blog precedente&lt;/a&gt; avevo parlato del &lt;em&gt;Single Table Inheritance&lt;/em&gt;. Grazie ad un campo apposito è possibile decidere a quale &lt;em&gt;entity&lt;/em&gt; farà parte il record di quella nostra tabella.&lt;/p&gt; &lt;p&gt;Il problema che sto cercando di risolvere in questi giorni si basa sul quesito:&lt;/p&gt; &lt;p&gt;&lt;em&gt;E' possibile dividere una tabella in due entity &lt;strong&gt;senza&lt;/strong&gt; questo campo?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma prima che subentri la confusione, il mio obbiettivo non è quello di creare due &lt;em&gt;entity&lt;/em&gt; parallele come nel caso di quel blog (&lt;em&gt;TextContents&lt;/em&gt; e &lt;em&gt;LinkContents&lt;/em&gt;), ma una &lt;em&gt;entity&lt;/em&gt; di base da cui deriva un'altra &lt;em&gt;entity&lt;/em&gt;. Per esempio, da questa tabella:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;strong&gt;&lt;em&gt;Nome campo&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;&lt;em&gt;Tipo&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;int&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Title&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;nvarchar(50)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;LongDescriptions&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;ntext&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Vorrei ottenere una struttura come questa (poi spiegherò il perché):&lt;/p&gt; &lt;p&gt;&lt;img height="300" alt="nuove entity" src="http://blogs.aspitalia.com/img/andrewz/ent.unatabelladueentitysenzadiscriminazi_8fd2/image_1.png" width="180" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Il problema che mi ero posto è molto semplice: in caso volessi visualizzare tutti i record della tabella in un menu di scelta, la richiesta dei dati presenti in un'unica &lt;em&gt;entity&lt;/em&gt; avrebbe richiesto tutti i campi anche quelli &lt;em&gt;ntext&lt;/em&gt; (che potrebbero contenere, per assurdo, mega di documenti di testo), come si può evitare questo?&lt;/p&gt; &lt;p&gt;Ah, dimenticavo, visto che questi dati devono attraversare dei layer dell'applicativo, non voglio usare gli anonynous type, altrimenti sarebbe troppo facile scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from d in Context.Documents&lt;br /&gt; select new { Id=d.Id, Title=d.Title };&lt;br /&gt;return coll;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Anche se questa soluzione porta l'&lt;em&gt;Entity Framework&lt;/em&gt; a inviare la giusta query al database:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;1 AS [C1], &lt;br /&gt;[Extent1].[Id] AS [Id], &lt;br /&gt;[Extent1].[Title] AS [Title]&lt;br /&gt;FROM [dbo].[Descriptions] AS [Extent1]&lt;/em&gt; &lt;p&gt;Una soluzione che mi hanno suggerito è creare una classe che ospiti solo quei dati: &lt;p&gt;&lt;em&gt;public class Elenco&lt;br /&gt;{&lt;br /&gt; public int Id { get; set; }&lt;br /&gt; public string Title { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var coll = from c in context.Descriptions&lt;br /&gt; select new Elenco { Id = c.Id, Title = c.Title };&lt;br /&gt;foreach (var item in coll)&lt;br /&gt;{&lt;br /&gt; Response.Write(string.Format(&lt;br /&gt; "{0} {1} &amp;lt;br /&amp;gt;",&lt;br /&gt; item.Id,&lt;br /&gt; item.Title&lt;br /&gt; ));&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Può andare. Si potrebbe trovare un'altra soluzione con l'uso delle viste. Creata questa vista: &lt;p&gt;&lt;em&gt;select Id,Title from Descriptions&lt;/em&gt; &lt;p&gt;Si possono creare due &lt;em&gt;entity&lt;/em&gt; distinte all'interno dell'editor di &lt;em&gt;Visual Studio 2008&lt;/em&gt;: &lt;p&gt;&lt;img height="322" alt="due entity con tabella e vista" src="http://blogs.aspitalia.com/img/andrewz/ent.unatabelladueentitysenzadiscriminazi_8fd2/image_3.png" width="190" border="0" /&gt; &lt;p&gt;Lo schifo è che sono due &lt;em&gt;entity&lt;/em&gt; distinte, ma risolvono in parte il problema. Segnalo che, importata questa vista nell'editor, i campi vengono visti entrambi come &lt;em&gt;key&lt;/em&gt;. Non è sufficiente modificare le proprietà nell'editor, è necessario aprire il file .edmx con un editor xml e cancellare la doppia key: &lt;p&gt;&lt;em&gt;&amp;lt;EntityType Name="DescriptionsTitles"&amp;gt;&lt;br /&gt; &amp;lt;Key&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Id" /&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Title" /&amp;gt;&lt;strong&gt; &amp;lt;-- Da cancellare&lt;br /&gt;&lt;/strong&gt; &amp;lt;/Key&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" /&amp;gt;&lt;br /&gt;&amp;lt;/EntityType&amp;gt;&lt;br /&gt;&amp;lt;EntityType Name="DescriptionsTitles"&amp;gt;&lt;br /&gt; &amp;lt;Key&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Id" /&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name="Title" /&amp;gt; &lt;strong&gt;&amp;lt;-- Da cancellare&lt;br /&gt;&lt;/strong&gt; &amp;lt;/Key&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Id" Type="Int32" Nullable="false" /&amp;gt;&lt;br /&gt; &amp;lt;Property Name="Title" Type="String" Nullable="false" /&amp;gt;&lt;br /&gt;&amp;lt;/EntityType&amp;gt;&lt;/em&gt; &lt;p&gt;Poco sopra nell'xml è possibile vedere com'è importata la vista:&lt;/p&gt; &lt;p&gt;&lt;em&gt; &amp;lt;EntitySet Name="DescriptionsTitles" EntityType="TestEntitiesModel.Store.DescriptionsTitles" store:Type="Views" store:Schema="dbo" store:Name="DescriptionsTitles"&amp;gt;&lt;br /&gt; &amp;lt;DefiningQuery&amp;gt;SELECT &lt;br /&gt;[DescriptionsTitles].[Id] AS [Id], &lt;br /&gt;[DescriptionsTitles].[Title] AS [Title]&lt;br /&gt;FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]&lt;br /&gt; &amp;lt;/DefiningQuery&amp;gt;&lt;br /&gt; &amp;lt;/EntitySet&amp;gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questo comporta, alla richiesta dei dati, l'esecuzione di questa query:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;[Extent1].[Id] AS [Id], &lt;br /&gt;[Extent1].[Title] AS [Title]&lt;br /&gt;FROM (SELECT &lt;br /&gt; [DescriptionsTitles].[Id] AS [Id], &lt;br /&gt; [DescriptionsTitles].[Title] AS [Title]&lt;br /&gt; FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]) AS [Extent1]&lt;/em&gt; &lt;p&gt;Alla fine c'è la soluzione compatibile con l'&lt;em&gt;Entity Framework&lt;/em&gt; e la mia necessità. Ma si deve mettere mano alla struttura del database. Si deve dividere quella tabella in due, spostando il campo &lt;em&gt;LongDescriptions&lt;/em&gt; nella seconda naturalmente collegando il tutto. L'EF non farà una piega e vedrà il tutto in modo corretto e otterrei ciò che voglio. &lt;p&gt; &lt;p&gt;&lt;em&gt;Posso avere tutto ciò che voglio? No, non è possibile.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx"&gt;&lt;em&gt;Entity Framework. Una tabella due Entity senza discriminazioni&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2383.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2383</trackback:ping></item><item><title>Entity Framework e pi&amp;#249; tabelle in una entity</title><link>http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx</link><pubDate>Wed, 03 Sep 2008 07:09:34 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2379" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Breve e coinciso. Due tabelle in una sola &lt;em&gt;entity&lt;/em&gt;. L'&lt;em&gt;Entity Framework&lt;/em&gt; lo permette con pochi passaggi e &lt;strong&gt;non&lt;/strong&gt; in automatico.&lt;/p&gt; &lt;p&gt;Mi servono due tabelle. Eccole:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Tutorials&lt;/strong&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;strong&gt;Nome campo&lt;/strong&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;Tipo e altro&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Int, key, Auto increment&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Name&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;nvarchar&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Description&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Text&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;Tutorials2&lt;/strong&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;strong&gt;Nome campo&lt;/strong&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;Tipo e altro&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Int, key&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Name&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;nvarchar&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;Description&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;Text&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Ora importiamo le due tabelle nel &lt;em&gt;designer&lt;/em&gt; di Visual Studio 2008. Creerà due &lt;em&gt;entity&lt;/em&gt; distinte. Non ci servono a nulla. Vanno cancellate. Quindi dalla &lt;em&gt;toolbar&lt;/em&gt;, inserire una nuovo oggetto &lt;em&gt;Entity&lt;/em&gt; e si mappano all'interno le due tabelle e tutti i campi, naturalmente inserendo nell'editor tante proprietà quante ne servono. Il risultato finale deve essere simile a questo:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img height="568" alt="mapping entity framework" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkepitabelleinunaentity_80c1/immagine%204_3.gif" width="510" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Tutto fatto. Ora possiamo farne quello che vogliamo:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (pubsModel.pubsEntities context = new pubsModel.pubsEntities()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pubsModel.Tutorials obj = new pubsModel.Tutorials(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj.Name1 = &amp;quot;A1&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj.Name2 = &amp;quot;A2&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj.Description1 = &amp;quot;D1&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj.Description2 = &amp;quot;D2&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.AddToTutorialsSet(obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Un ringraziamento a &lt;a title="link esterno" href="http://blogs.dotnethell.it/david/"&gt;David&lt;/a&gt; che mi ha dato un ottimo suggerimento a riguardo. Ora ho solo un unico dubbio e poi con l'&lt;em&gt;EF&lt;/em&gt; spacco tutto: dividere una tabella in due o più &lt;em&gt;entity&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx"&gt;&lt;em&gt;Entity Framework e pi&amp;amp;ugrave; tabelle in una entity&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2379/Entity-Framework-Tabelle-Entity.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2379.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2379</trackback:ping></item><item><title>L&amp;#39;Entity Framework e le custom class coinvolte nei where...</title><link>http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx</link><pubDate>Sun, 31 Aug 2008 01:04:02 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2378" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Riprendo il solito esempio di &lt;em&gt;entity&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;img alt="entity in visual studio 2008" src="http://blogs.aspitalia.com/img/andrewz/entityframew.unminimodicachefacevaschifo_10861/image_6.png" /&gt; &lt;/p&gt; &lt;p&gt;Ipotizzando di voler recuperare tutti gli &lt;em&gt;Articles&lt;/em&gt; con un determinato colore si potrebbe essere spinti a scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var c=Context.Colors.Where(cc=&amp;gt;cc.Id==1).First();&lt;br /&gt;var coll=from ar in Context.Articles.Include("Colors")&lt;br /&gt; where ar.Colors=c&lt;br /&gt; select ar;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Semplicemente, avendo una &lt;em&gt;entity&lt;/em&gt; voglio vedere tutte le &lt;em&gt;entity&lt;/em&gt; che hanno come &lt;em&gt;property&lt;/em&gt; questo oggetto. Eseguita, però, si ottienere questo errore:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Unable to create a constant value of type 'Closure type'. Only primitive types (for instance Int32, String and Guid) are supported in this context.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questo perché l'EF non permette il confronto tra &lt;em&gt;oggetti complessi&lt;/em&gt;. La soluzione è banale, anzi, in qualche caso più semplice (nel caso di &lt;em&gt;web control&lt;/em&gt; che ritornano un valore numerico per identificare una scelta di un utente, per sempio da un &lt;em&gt;dropdownlist&lt;/em&gt;):&lt;/p&gt; &lt;p&gt;&lt;em&gt;int c=int.Parse(ddl_colors.SelectedValue); // &amp;lt;- prendo il colore selezionato&lt;br /&gt;var coll=from ar in Context.Articles.Include("Colors")&lt;br /&gt; where ar.Colors.Id=c&lt;br /&gt; select ar;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Oppure:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var c=Context.Colors.Where(cc=&amp;gt;cc.Id==1).First();&lt;br /&gt;var coll=from ar in Context.Articles.Include("Colors")&lt;br /&gt; where ar.Colors.Id=c.Id&lt;br /&gt; select ar;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Soluzione semplice, ma è sempre bene saperla.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx"&gt;&lt;em&gt;L&amp;#39;Entity Framework e le custom class coinvolte nei where...&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2378/LEntity-Framework-Custom-Class-Coinvolte-Where.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2378.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2378</trackback:ping></item><item><title>Entity Framework e l&amp;#39;ereditariet&amp;#224; (Single Table Inheritance)</title><link>http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx</link><pubDate>Sat, 30 Aug 2008 13:07:56 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2377" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Visto che in questi gioni sto usando parecchio con l'&lt;em&gt;Entity Framework&lt;/em&gt; questa &lt;em&gt;Table Per Hierarchy&lt;/em&gt; (Emanuele mi correggerà se, come al solito, sbaglio la nomenclatura), ecco due appunti su come si realizza con l'editor che mette a disposizione Visual Studio 2008.&lt;/p&gt; &lt;p&gt;L'inizio è questa semplice tabella dal nome &lt;em&gt;BaseContents&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;img height="180" alt="struttura tabella" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_1.png" width="340" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Da questa singola tabella è possibile estrarre due &lt;em&gt;entity&lt;/em&gt; distinte. Nel mio caso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;TextContents &lt;li&gt;LinkContents&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;La prima utilizzata per memorizzare il contenuto reale di un eventuale testo, la seconda per link a risorse esterne. All'interno di questa singola tabella sono contenuti tutti i campi per memorizzare queste informazioni. L'unico campo aggiuntivo, che farà da &lt;em&gt;discriminante&lt;/em&gt;, come si vedrà di seguito, è &lt;em&gt;Type&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Creato in Visual Studio 2008 un nuovo oggetto &lt;em&gt;ADO.Net Entity Data Model&lt;/em&gt;, e importanto all'interno di questo oggetto la tabella sopra mostrata, si avrà la prima &lt;em&gt;entity&lt;/em&gt; creata in automatico dall'ambiente di sviluppo con tutti i campi interessati.&lt;/p&gt; &lt;p&gt;Ora è possibile aggiunere le entity mancanti, &lt;em&gt;TextContents&lt;/em&gt; e &lt;em&gt;LinkContents&lt;/em&gt;, ereditandole direttamente da questa (è sufficiente cliccare con il tasto destro all'interno dell'editor e selezionare &lt;em&gt;Add&lt;/em&gt; -&amp;gt; &lt;em&gt;Entity&lt;/em&gt;). Aggiunte le due entity ecco cosa abbiamo in VS 2008:&lt;/p&gt; &lt;p&gt;&lt;img height="346" alt="entity" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_7.png" width="342" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Ora possiamo spostare le &lt;em&gt;property&lt;/em&gt; di nostro interesse nelle sottostanti &lt;em&gt;entity &lt;/em&gt;per ottenere questo:&lt;/p&gt; &lt;p&gt;&lt;img height="376" alt="entity" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_9.png" width="340" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Dalla window Mapping details, mappiamo la tabella e assicurati che tutti i campi interessati siamo mappati correttamente, possiamo inserire la condizione discriminante, in modo che nell'uso di una o dell'altra entity, siano salvati i dati corretti nella tabella. Nulla di difficile, sempre da &lt;em&gt;Mapping details&lt;/em&gt;, si aggiunge nelle &lt;em&gt;condition&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_10.png" atomicselection="true"&gt;&lt;img height="174" alt="conditions" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelereditarietsingletablei_c776/image_thumb_5.png" width="520" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In questo caso ho inserito il valore &lt;em&gt;1&lt;/em&gt; in &lt;em&gt;Type&lt;/em&gt; per il &lt;em&gt;TextContents&lt;/em&gt;, e &lt;em&gt;2&lt;/em&gt; per il &lt;em&gt;LinkContents&lt;/em&gt;. Sembra tutto fatto, ma ecco l'amara sorpresa che ho trovato compilando il tutto:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Error 1 Error 3032: Problem in Mapping Fragment starting at line 49: Condition member 'BaseContents.Type' with a condition other than 'IsNull=False' is mapped. Either remove the condition on BaseContents.Type or remove it from the mapping.&lt;/strong&gt; &lt;p&gt;Scopro che &lt;em&gt;Type&lt;/em&gt; crea un problema. Il mio primo tentativo di cancellazione di questa property dall'&lt;em&gt;entity&lt;/em&gt; &lt;em&gt;BaseContents&lt;/em&gt; mi porta un nuovo errore: &lt;p&gt;&lt;strong&gt;Error 1 Error 3023: Problem in Mapping Fragments starting at lines 48, 54, 59: Column BaseContents.Type has no default value and is not nullable. A column value is required to store entity data.&lt;br /&gt;An Entity with Key (PK) will not round-trip when:&lt;br /&gt; (PK is in 'BaseContents' EntitySet AND Entity is type TestEntitiesModel.BaseContents)&lt;/strong&gt; &lt;p&gt;Alla fine scopro la soluzione da un &lt;a href="http://weblogs.asp.net/zeeshanhirani/archive/2008/08/16/single-table-inheritance-in-entity-framework.aspx"&gt;blog&lt;/a&gt; di &lt;a href="http://weblogs.asp.net/zeeshanhirani/default.aspx"&gt;Zeeshan Hirani&lt;/a&gt; (che spiega il tutto in modo molto più dettagliato, ma visto che ho scritto fino a qua, non ho voglia di buttare il tutto) che ringrazio perché mi ha fatto trovare immediatamente la soluzione. E' sufficiente modificare la &lt;em&gt;property&lt;/em&gt; &lt;em&gt;Abstract&lt;/em&gt; dell&lt;em&gt;'Entity BaseContents&lt;/em&gt; in &lt;em&gt;true&lt;/em&gt;, per eliminare ogni errore. &lt;p&gt;Ora da codice possiamo inserire e leggere da questa tabella con due &lt;em&gt;entity&lt;/em&gt; separate: &lt;p&gt;&lt;em&gt;using (TestEntitiesModel.TestEntitiesEntities context = new TestEntitiesModel.TestEntitiesEntities())&lt;br /&gt;{&lt;br /&gt; TestEntitiesModel.TextContents c = new TestEntitiesModel.TextContents();&lt;br /&gt; c.Name = "Example 1";&lt;br /&gt; c.Content = "Content text bla bla bla";&lt;br /&gt; context.AddToBaseContents(c);&lt;br /&gt; TestEntitiesModel.LinkContents l = new TestEntitiesModel.LinkContents();&lt;br /&gt; l.Name = "Example 2";&lt;br /&gt; l.Link = "www.aspitalia.com";&lt;br /&gt; l.Impressions = 0;&lt;br /&gt; context.AddToBaseContents(l);&lt;br /&gt; context.SaveChanges();&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Visualizzando il contenuto della tabella troveremo:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="510" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="66"&gt;I&lt;strong&gt;d&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Impressions&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="66"&gt;1&lt;/td&gt; &lt;td  width="66"&gt;Example1&lt;/td&gt; &lt;td  width="66"&gt;&lt;em&gt;null&lt;/em&gt;&lt;/td&gt; &lt;td  width="66"&gt;&lt;em&gt;null&lt;/em&gt;&lt;/td&gt; &lt;td  width="66"&gt;Content text bla bla bla&lt;/td&gt; &lt;td  width="66"&gt;1&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="66"&gt;2&lt;/td&gt; &lt;td  width="66"&gt;Example2&lt;/td&gt; &lt;td  width="66"&gt;www.aspitalia.com&lt;/td&gt; &lt;td  width="66"&gt;1&lt;/td&gt; &lt;td  width="66"&gt;&lt;em&gt;null&lt;/em&gt;&lt;/td&gt; &lt;td  width="66"&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Per leggere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestEntitiesModel.TestEntitiesEntities context = new TestEntitiesModel.TestEntitiesEntities())&lt;br /&gt;{&lt;br /&gt; var coll = from c in context.BaseContents.OfType&amp;lt;TestEntitiesModel.TextContents&amp;gt;()&lt;br /&gt; orderby c.Content ascending&lt;br /&gt; select c;&lt;br /&gt; foreach (var item in coll)&lt;br /&gt; {&lt;br /&gt; Response.Write(string.Format("{0} {1} {2}&amp;lt;br /&amp;gt;",&lt;br /&gt; item.Id,item.Name,item.Content));&lt;br /&gt; }&lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa volta per specificare l'&lt;em&gt;entity&lt;/em&gt; da leggere, dobbiamo utilizzare l'&lt;em&gt;OfType&lt;/em&gt; come da esempio. Se volessimo richiedere l'&lt;em&gt;entity&lt;/em&gt; &lt;em&gt;LinkContents&lt;/em&gt;, avremmo duvuto scrivere:&lt;/p&gt;&lt;em&gt; var coll = from c in context.BaseContents.OfType&amp;lt;TestEntitiesModel.&lt;strong&gt;Link&lt;/strong&gt;Contents&amp;gt;()&lt;/em&gt;&lt;br /&gt; &lt;p&gt;Oltre al &lt;em&gt;Table Per Hierarchy (Single Table Inheritance)&lt;/em&gt; l'&lt;em&gt;EntityFramework&lt;/em&gt; mette a disposizione altri due tipi di &lt;em&gt;inheritance&lt;/em&gt;:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;em&gt;Table Per Type&lt;/em&gt; &lt;li&gt;&lt;em&gt;Table Per Concrete Class&lt;/em&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Ma le cosa iniziano a complicarsi un po' con l'editor di VS2008.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx"&gt;&lt;em&gt;Entity Framework e l&amp;#39;ereditariet&amp;amp;agrave; (Single Table Inheritance)&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2377/Entity-Framework-Ereditarieta-Single-Table-Inheritance.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2377.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2377</trackback:ping></item><item><title>L&amp;#39;entity Framework e i vincoli FOREIGN KEY</title><link>http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx</link><pubDate>Thu, 28 Aug 2008 07:12:13 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2374" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;L'&lt;em&gt;entity framework&lt;/em&gt; rende felice. Ti fa vedere il mondo dei database sotto un'altra ottica. Le complicazioni create dai soliti esperti di struttura dei database fanno ora sorridere, anzi, li si incita a complicare maggiormente la struttura delle tabella per normalizzazioni fino al quinto livello.&lt;/p&gt; &lt;p&gt;-&lt;em&gt; Il terzo livello basta! &lt;br /&gt;&lt;/em&gt;- &lt;em&gt;No, andiamo fino al quinti livello di normalizzazione!&lt;/em&gt; - possono ora affermare i &lt;em&gt;dev &lt;/em&gt;sorseggiando un caffè alle loro spalle.&lt;/p&gt; &lt;p&gt;A parte queste &lt;em&gt;ciance&lt;/em&gt;, una delle attenzioni che si devono avere quando si usa l'&lt;em&gt;Entity Framework&lt;/em&gt; è quando si cancellano delle &lt;em&gt;entity&lt;/em&gt; dal database quando sono in gioco &lt;em&gt;Foreign key&lt;/em&gt; e amenità simili. Inoltre, la cancellazione di una entità non elimina - giustamente - di suo eventuali proprietà collegate uno-a-uno con un'altra tabella (sempre che sul db non ci siano regole varie, ma in questo caso di deve prestare attenzione, perché la cache interna dell'&lt;em&gt;Entity Framework&lt;/em&gt; la vedrà ancora presente). Buona regola, nel caso di voler cancellare tutti i record coinvolti in una entità, scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (pubsModel.pubsEntities2 context = new pubsModel.pubsEntities2()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var padre = context.Canc_Padre.Include(&amp;quot;Canc_Figlia&amp;quot;).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var figlia = padre.Canc_Figlia; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.DeleteObject(figlia); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.DeleteObject(padre); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;In questo caso le tabelle di chiamano &lt;em&gt;Canc&lt;/em&gt;_&lt;em&gt;Padre&lt;/em&gt; e &lt;em&gt;Canc&lt;/em&gt;_&lt;em&gt;Figlia&lt;/em&gt;. L'ordine di cancellazione dev'essere anche quello mostrato (prima la tabella figlia e poi la padre), perché la cancellazione dell'entità padre farebbe perdere il collegamento con il record da cancellare con la necessità di una nuova query di &lt;em&gt;select&lt;/em&gt; di ricerca. &lt;/p&gt; &lt;p&gt;Ma nel caso delle relazioni molti-a-molti? Prendiamo d'esempio un classico schema con tre tabelle: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;authors &lt;/li&gt; &lt;li&gt;books &lt;/li&gt; &lt;li&gt;authorsbooks&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Le prime due sono le classiche tabelle che conterranno i dati, la terza quella che collega i dati delle due.&lt;/p&gt; &lt;p&gt;Scrivendo questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (pubsModel.pubsEntities2 context = new pubsModel.pubsEntities2()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var coll = (from au in context.authors &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where au.name==&amp;quot;...&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select au).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.DeleteObject(coll); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Otterremo il classico errore:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;L'istruzione DELETE è in conflitto con il vincolo REFERENCE &amp;quot;FK_authors_books_authors&amp;quot;. Il conflitto si è verificato nella tabella &amp;quot;dbo.authorsbooks&amp;quot;, column 'id_author' del database &amp;quot;pubs&amp;quot;.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Per evitare questo problema, cioè cancellare il record dalla tabella &lt;em&gt;authors&lt;/em&gt; e ogni suo riferimento dalla tabella &lt;em&gt;authorsbooks&lt;/em&gt;, dovremo invece scrivere:&lt;/p&gt; &lt;em&gt;using (pubsModel.pubsEntities2 context = new pubsModel.pubsEntities2()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var coll = (from au in context.authors.&lt;strong&gt;Include(&amp;quot;books&amp;quot;)&lt;/strong&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where au.name==&amp;quot;...&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select au).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.DeleteObject(coll); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Se volessimo cancellare anche il record in &lt;em&gt;book&lt;/em&gt;, dovremo fare come sopra: recuperata l'&lt;em&gt;entity&lt;/em&gt; usare il &lt;em&gt;DeleteObject&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;PS: ieri sera ho dovuto aspettare venti minuti il pullman per tornare a casa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx"&gt;&lt;em&gt;L&amp;#39;entity Framework e i vincoli FOREIGN KEY&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, Database, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx</guid><slash:comments>6</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2374/Lentity-Framework-Vincoli-FOREIGN-KEY.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2374.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2374</trackback:ping></item><item><title>Lazy Loading con l&amp;#39;Entity Framework</title><link>http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx</link><pubDate>Wed, 27 Aug 2008 11:33:57 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2372" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Anche se qualcuno afferma il contrario, non cito la fonte, abbiamo a disposizione più metodi per caricare entità collegate. In tutti questi post dedicati all'&lt;em&gt;Entity Framework&lt;/em&gt; ho fatto sempre esempio che riguardavano più tabelle (~entità) collegate.&lt;/p&gt; &lt;p&gt;Possiamo fare in modo che sia lo stesso &lt;em&gt;Entity Framework&lt;/em&gt; a caricare con una query il tutto grazie a Include:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from c in EntityContext.Articles.Include(&amp;quot;Authors&amp;quot;) &lt;br /&gt;select c; &lt;br /&gt;foreach (var item in coll) &lt;br /&gt;{ &lt;br /&gt;Response.Write(item.Title); &lt;br /&gt;Response.Write(item.Authors.Name); &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Oppure possiamo forzare il caricamente delle entità collegate, in questo caso &lt;em&gt;Authors&lt;/em&gt;, ad ogni richiesta della stessa:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from c in EntityContext.Articles &lt;br /&gt;select c; &lt;br /&gt;foreach (var item in coll) &lt;br /&gt;{ &lt;br /&gt;Response.Write(item.Title); &lt;br /&gt;if (item.AuthorsReference.IsLoaded) // Controlla se già presente in memoria &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write(item.AuthorsReference.Value.Name); &lt;br /&gt;else &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.AuthorsReference.Load(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write(item.Authors.Name); &lt;br /&gt;} &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;In quest'ultimo caso all'inizio viene eseguita una query che richiede solo la lista degli &lt;em&gt;Articles&lt;/em&gt;. Quindi viene verificato che l'entità per gli &lt;em&gt;Authors&lt;/em&gt; non sia già presente in memoria; se presente la visualizza direttamente, altrimenti esegue una query al database.&lt;/p&gt; &lt;p&gt;Il numero di query inviate al database è N+(numero di autori richiesti differenti). Ipoteticamente, se tutti gli articoli fossero collegati ad un solo autore, il numero di query inviate al database sarebbero due.&lt;/p&gt; &lt;p&gt;PS: scusate la brevità ma il tempo è tiranno. O Tir&lt;em&gt;à&lt;/em&gt;no?&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx"&gt;&lt;em&gt;Lazy Loading con l&amp;#39;Entity Framework&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx</guid><slash:comments>6</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2372/Lazy-Loading-Entity-Framework.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2372.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2372</trackback:ping></item><item><title>A volte ritornano... GridView vs Repeater vs ListView vs Custom</title><link>http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx</link><pubDate>Tue, 26 Aug 2008 07:20:37 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2370" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;a href="http://blogs.aspitalia.com/az/post549/ancora-prestazioni-datagrid-datalist-repeater-.aspx"&gt;Sono passati anni&lt;/a&gt;? Parecchio tempo fa avevo confrontato le prestazioni nel binding dei dati tra i più noti webcontrol. Ecco un refresh, questa volta con il Framework 3.5 e con lo scontro tra:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Gridview &lt;/li&gt; &lt;li&gt;Repeater &lt;/li&gt; &lt;li&gt;ListView &lt;/li&gt; &lt;li&gt;Custom code&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Chiunque un po' smaliziato con il .net saprà già chi vince e chi è il peggiore tra questi. Ma per i novizi è sempre meglio saperlo. Innanzitutto, il codice per il popolamento delle tabelle html è il seguente:&lt;/p&gt; &lt;p&gt;&lt;em&gt;List&amp;lt;Person&amp;gt; p; &lt;br /&gt;p = new List&amp;lt;Person&amp;gt;(200); &lt;br /&gt;for (int i = 0; i &amp;lt; 200; i++) &lt;br /&gt;&amp;nbsp; p.Add(new Person { Id=i, Age=i, Description=&amp;quot;Desc &amp;quot;+i.ToString(), Name=&amp;quot;Name &amp;quot;+i.ToString() }); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Il &lt;em&gt;gridview&lt;/em&gt; crea la table html con questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;asp:GridView ID=&amp;quot;gw1&amp;quot; EnableViewState=&amp;quot;false&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateColumns=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Columns&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&amp;quot;id&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&amp;quot;name&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&amp;quot;age&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&amp;quot;description&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt; &lt;br /&gt;&amp;lt;/asp:GridView&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Per il &lt;em&gt;repeater&lt;/em&gt; abbiamo: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;asp:Repeater ID=&amp;quot;rp1&amp;quot; runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;HeaderTemplate&amp;gt;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/HeaderTemplate&amp;gt; &lt;br /&gt;&amp;lt;FooterTemplate&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/FooterTemplate&amp;gt; &lt;br /&gt;&amp;lt;ItemTemplate&amp;gt; &lt;br /&gt;&amp;lt;tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;id&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;name&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;age&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;description&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;lt;/ItemTemplate&amp;gt; &lt;br /&gt;&amp;lt;/asp:Repeater&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;M&lt;/em&gt;a siccome vogliamo ottimizzare un po', possiamo scrivere: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Id %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Name %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Age %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Description %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;lt;/tr&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ecco il &lt;em&gt;ListView&lt;/em&gt;, semplice: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;asp:ListView ID=&amp;quot;lw1&amp;quot; runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LayoutTemplate&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Panel ID=&amp;quot;itemPlaceholder&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/LayoutTemplate&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;id&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;name&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;age&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# Eval(&amp;quot;description&amp;quot;) %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt; &lt;br /&gt;&amp;lt;/asp:ListView&amp;gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;E ottimizzato: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;ItemTemplate&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Id %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Name %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Age %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%# ((Person)Container.DataItem).Description %&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt; &lt;br /&gt;&amp;lt;/ItemTemplate&amp;gt; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;E infine creiamo la griglia da codice con un banale &lt;em&gt;StringBuilder&lt;/em&gt; da codice: &lt;/p&gt; &lt;p&gt;&lt;em&gt;var sb = new StringBuilder(10000); &lt;br /&gt;sb.Append(&amp;quot;&amp;lt;table border='1'&amp;gt;&amp;quot;); &lt;br /&gt;for (int i = 0; i &amp;lt; p.Count; i++) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(p&lt;i&gt;.Id); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(p&lt;i&gt;.Name); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(p&lt;i&gt;.Age); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(p&lt;i&gt;.Description); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;); &lt;br /&gt;} &lt;br /&gt;sb.Append(&amp;quot;&amp;lt;/table&amp;gt;&amp;quot;); &lt;br /&gt;pn1.Controls.Add(new LiteralControl(sb.ToString())); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;pn1&lt;/em&gt; è un &lt;em&gt;panel&lt;/em&gt;. Ma vediamo le prestazioni (medie): &lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;GridView&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;strong&gt;&lt;em&gt;0.122s&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;Repeater&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.058s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;Repeater ottimizzato&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.046s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;ListView&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.059s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;ListView ottimizzato&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.047s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;Custom code&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="200"&gt;&lt;em&gt;&lt;strong&gt;0.006s&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;A parte la tabella scritta con lo &lt;em&gt;StringBuilder&lt;/em&gt; che mediamente risulta otto volte più veloce del &lt;em&gt;ListView&lt;/em&gt; e del &lt;em&gt;Repeater&lt;/em&gt;, la sorpresa è proprio il &lt;em&gt;ListView&lt;/em&gt; che risulta veloce quanto il &lt;em&gt;Repeater&lt;/em&gt;. In poche parole? Il &lt;em&gt;DataGrid&lt;/em&gt;, &lt;em&gt;DataList&lt;/em&gt;, &lt;em&gt;DataGrid&lt;/em&gt; e &lt;em&gt;Repeater&lt;/em&gt; sono diventati obsoleti e inutili dato il &lt;em&gt;ListView&lt;/em&gt; non solo sostituisce in tutto questi webcontrol, ma ha prestazioni più che buone.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Inoltre, per avere un discreto guadagno, anche la visualizzazione con il &lt;em&gt;casting&lt;/em&gt; di tipo nella colonna, invece dell'&lt;em&gt;Eval&lt;/em&gt;, è consigliato.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Datagrid/" rel="tag"&gt;Datagrid&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/GridView/" rel="tag"&gt;GridView&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx"&gt;&lt;em&gt;A volte ritornano... GridView vs Repeater vs ListView vs Custom&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, ASP.NET, ASP.NET 2.0, ASP.NET 3.5, Databinding, Datagrid, GridView</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx</guid><slash:comments>18</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2370/Volte-Ritornano.-GridView-Repeater-ListView-Custom.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2370.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2370</trackback:ping></item><item><title>L&amp;#39;Entity Framework e l&amp;#39;ObjectDataSource</title><link>http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx</link><pubDate>Sun, 24 Aug 2008 19:26:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2369" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Anche se con l'SP1 del Framework 3.5 è stato introdotto il nuovo &lt;em&gt;EntityDataSource&lt;/em&gt; per collegare direttamente questi nuovi oggetti a web control come il &lt;em&gt;ListView&lt;/em&gt; o il &lt;em&gt;GridView&lt;/em&gt;, l'utilizzo dell'&lt;em&gt;ObjectDataSource&lt;/em&gt; rimane sempre la soluzione migliore: come dice &lt;a href="http://blogs.aspitalia.com/daniele"&gt;Daniele&lt;/a&gt;, i &lt;em&gt;datasource&lt;/em&gt; come l'&lt;em&gt;SqlDataSource&lt;/em&gt; e compagnia bella sono solo veramente utili per le demo.&lt;/p&gt;&lt;p&gt;Di base non ci sono problemi. Solo di base però. Quando si cerca di fare qualcosa di più complesso saltano sempre fuori casini vari. Messo nella pagina un &lt;em&gt;ListView&lt;/em&gt; collegato ad un bel &lt;em&gt;ObjectDataSource&lt;/em&gt; che utilizza una classe apposita che ritorna le entità (nel mio caso con l'ausilio dell'&lt;em&gt;Entity Framework&lt;/em&gt;) non ci sono problemi: persino altre entità memorizzate in proprietà vengono visualizzate correttamente. Come nell'esempio già &lt;a href="http://blogs.aspitalia.com/az/post2361/entity-framework-sql-generato.aspx"&gt;visto&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;img alt="gridview" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelsqlgenerato_adf2/image_1.png" /&gt; &lt;/p&gt;&lt;p&gt;I problemi nascono quando entrano in gioco gli update e gli insert. Come scritto sopra, di base, cioè con proprietà con tipi non complessi, non ci sono problemi. Definendo nell'&lt;em&gt;InsertMethod&lt;/em&gt; dell'&lt;em&gt;ObjectDataSource&lt;/em&gt; una nostra funzione come la seguente, tutto funziona:&lt;/p&gt;&lt;p&gt;&lt;em&gt;[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]&lt;br /&gt;public static void InsertAuthor(Author author)&lt;br /&gt;{&lt;br /&gt;using (TestEntitiesModel.TestEntitiesCode context = new TestEntitiesModel.TestEntitiesCode())&lt;br /&gt;{&lt;br /&gt;context.addAuthors(author);&lt;br /&gt;context.SaveChanges();&lt;br /&gt;} &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt;&lt;p&gt;Che bello! Eh sì, ma l'entità qui trattata ha anche come proprietà la collection di &lt;em&gt;Book&lt;/em&gt; collegati all'autore secondo il seguente schema: &lt;/p&gt;&lt;p&gt;&lt;img alt="entity framework" src="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_6.png" /&gt; &lt;/p&gt;&lt;p&gt;Per visualizzare il tutto in modalità &lt;em&gt;edit&lt;/em&gt; si incotrano le prime rogne ma risolvibile. Ma cosa viene passato al metodo &lt;em&gt;InsertAuthor&lt;/em&gt; prima mostrato? Tutto, tranne, ovviamente, eventuli aggiunte ai &lt;em&gt;book&lt;/em&gt;. Qui l'esempio è un po' forzato, ma un caso reale potrebbe essere la creazione di un nuovo utente e il collegamento ad esso di una o più role per autorizzazione varie (visualizzate in modalità &lt;em&gt;edit&lt;/em&gt; come lista con &lt;em&gt;checkbox&lt;/em&gt;). &lt;/p&gt;&lt;p&gt;Come inviare il tutto in modo corretto a quella funzione o quasi? &lt;/p&gt;&lt;p&gt;Io ho solo trovato un espediente, ma spero ci siano soluzioni più semplici che finora mi sono sfuggite. Utilizzando l'evento &lt;em&gt;On_ItemInserting&lt;/em&gt; dell'&lt;em&gt;ListView&lt;/em&gt; possiamo forza l'aggiunta di tutte le informazioni utili: &lt;/p&gt;&lt;p&gt;&lt;em&gt;protected void lw_authors_ItemInserting(object sender, ListViewInsertEventArgs e)&lt;br /&gt;{&lt;br /&gt;// In Values troviamo tutti i valori letti dal objectdatasource (BoundColumn, Bind, ecc...)&lt;br /&gt;// Inserisce un campo aggiuntivo perla data presente nel db ma non del ListView&lt;br /&gt;e.Values.Add(&amp;quot;CreationData&amp;quot;, DateTime.Now);&lt;br /&gt;var books = new System.Data.Objects.DataClasses.EntityCollection&lt;book /&gt;();&lt;br /&gt;// Metodi che richiedono le entità da collegare&lt;br /&gt;books.Add( AZ.GetBookFromId(1) );&lt;br /&gt;books.Add( AZ.GetBookFromId(2) );&lt;br /&gt;e.Values.Add(&amp;quot;Books&amp;quot;, auths);&lt;br /&gt;} &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Innanzitutto, l'&lt;em&gt;objectdatasource&lt;/em&gt; espone la connection come &lt;em&gt;EntityConnection&lt;/em&gt;, quindi perché possa essere riconosciuta dobbiamo inserire tutti gli item selezionati in questa collection. Sembra tutto ok, in questo modo all'evento di inserimento &lt;em&gt;dovrebbe&lt;/em&gt; essere passato il tutto correttamente. Dovrebbe! Richiamato questo codice si ha come output un errore chiarissimo in merito proprio al momento dell'&lt;em&gt;Add&lt;/em&gt;:&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;strong&gt;The object could not be added to the EntityCollection or EntityReference. An object that is attached to an ObjectContext cannot be added to an EntityCollection or EntityReference that is not associated with a source object.&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Allora ecco l'&lt;em&gt;escamotage&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;protected void lw_users_ItemInserting(object sender, ListViewInsertEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var books = new System.Data.Objects.DataClasses.EntityCollection&amp;lt;Book&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; books.Add(new&amp;nbsp;Book { Id = 1 });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; books.Add(new&amp;nbsp;Book { Id = 2 });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Values.Add("Books", auths);&lt;br&gt;} &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Creo due nuove classi &lt;em&gt;Book&lt;/em&gt; dove inserisco gli &lt;em&gt;Id&lt;/em&gt; dei valori selezionati nell'interfaccia grafica (qui inseriti da codice per rendere il tutto più semplice). Ora il codice per l'inserimento dovrebbe accettare anche questi dati aggiuntivi, ma ecco il secondo problema della giornata: quelle entità verrebbero trattate come nuovi oggetti e inseriti nuovamente nel database. Ecco dunque l'ultima modifica al codice, questa volta nella funzione di inserimento:&lt;/p&gt;&lt;em&gt;[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]&lt;br&gt;public static void InsertAuthor(Author author)&lt;br&gt;{&lt;br&gt;&amp;nbsp;using (TestEntitiesModel.TestEntitiesCode context = new TestEntitiesModel.TestEntitiesCode())&lt;br&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp; var coll = user.Books.Select(r =&amp;gt; r.Id).ToArray&amp;lt;int&amp;gt;();&lt;br&gt;&amp;nbsp; user.Books.Clear();&lt;br&gt;&amp;nbsp; foreach (var item in coll)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; user.Books.Add( context.Books.Where( r=&amp;gt;r.Id==item ).FirstOrDefault() );&lt;br&gt;&amp;nbsp; // Oppure&lt;br&gt;&amp;nbsp; // foreach (var item in coll)&lt;br&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp; user.Books.Add(&amp;nbsp;context.GetObjectbyKey( item ) );&lt;br&gt;&amp;nbsp;&amp;nbsp;context.addAuthors(author);&lt;br&gt;&amp;nbsp; context.SaveChanges();&lt;br&gt;&amp;nbsp;} &lt;br&gt;}&lt;/em&gt; 
&lt;p&gt;E tutto funziona correttamente. Ma spero ci siano soluzioni più immediate e semplici. Vero? Ditemi di sì! :(&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx"&gt;&lt;em&gt;L&amp;#39;Entity Framework e l&amp;#39;ObjectDataSource&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx</guid><slash:comments>15</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2369/LEntity-Framework-ObjectDataSource.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2369.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2369</trackback:ping></item><item><title>SP vs Linq vs Entity Framework in scrittura</title><link>http://blogs.aspitalia.com/az/post2368/SP-Linq-Entity-Framework-Scrittura.aspx</link><pubDate>Fri, 22 Aug 2008 21:11:44 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2368" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;La sola sicurezza che avevo era &lt;strong&gt;di quanto&lt;/strong&gt; Linq e l'Entity Framework fossero più lenti. Mi preparo un banale test per l'inserimento di un buon numero di record in un database Sql server 2005 per un benchmark personale. Creo due tabelle collegate dalla struttura molto semplice:&lt;/p&gt; &lt;p&gt;&lt;img height="320" alt="struttura tabelle" src="http://blogs.aspitalia.com/img/andrewz/spvslinqvsentityframeworkinscrittura_141e2/image_1.png" width="358" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Il mio test è molto banale: creare un array casuale di 100 padri, e ogni padre un array casuale di 100 figli. Gli sfidanti e le armi utilizzate sono i seguenti:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Collection tradizionale e stored procedure (una per ogni tabella) richiamata con il &lt;em&gt;Prepare&lt;/em&gt; del &lt;em&gt;Command&lt;/em&gt; per il massimo delle prestazioni.&lt;/li&gt; &lt;li&gt;Collection inserita direttamente in un DataContext creato da Visual Studio 2008.&lt;/li&gt; &lt;li&gt;Collection inserita direttamente nelle collection create dall'Entity Framework.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ecco di seguito il DataContext usato da Linq:&lt;/p&gt; &lt;p&gt;&lt;img height="298" alt="datacontext di linq" src="http://blogs.aspitalia.com/img/andrewz/spvslinqvsentityframeworkinscrittura_141e2/image_3.png" width="236" border="0" /&gt;&lt;/p&gt; &lt;p&gt;E l'&lt;em&gt;Entity Framework&lt;/em&gt; creato sempre da VS2008:&lt;/p&gt; &lt;p&gt;&lt;img height="352" alt="l'entity framework creato da vs2008" src="http://blogs.aspitalia.com/img/andrewz/spvslinqvsentityframeworkinscrittura_141e2/image_5.png" width="182" border="0" /&gt;&lt;/p&gt; &lt;p&gt; Avvio più volte i test per ogni tecnologia utilizzata. La media è la seguente:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="133"&gt;&lt;strong&gt;Stored procedure&lt;/strong&gt;&lt;/td&gt; &lt;td  width="133"&gt;&lt;strong&gt;Linq to Sql&lt;/strong&gt;&lt;/td&gt; &lt;td  width="133"&gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="133"&gt;6.75&lt;em&gt;s&lt;/em&gt;&lt;/td&gt; &lt;td  width="133"&gt;20.60&lt;em&gt;s&lt;/em&gt;&lt;/td&gt; &lt;td  width="133"&gt;12.93&lt;em&gt;s&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Sulla maggiori performance dell'inserimento diretto da codice con le &lt;em&gt;stored procedure&lt;/em&gt;, come già detto, non ne avevo il minimo dubbio: il tutto è ottimizzato al meglio, ed ho cercato anche da codice di ottimizzare il più possibile la creazione di oggetti e il passaggio di parametri. La delusione è stata invece per Linq, che le prende sonoramente anche dall'&lt;em&gt;Entity Framework&lt;/em&gt; che si dimostra molto più efficiente del tradizionale &lt;em&gt;Linq to Sql&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Leggendo con il Profiler le query inviate da &lt;em&gt;Linq to Sql&lt;/em&gt; e dall'&lt;em&gt;Entity Framework&lt;/em&gt;, si notano alcune differenze nelle query di inserimento create:&lt;/p&gt; &lt;p&gt;&lt;em&gt;-- Linq to Sql&lt;br /&gt;-- Inserimento nella tavella 'Padri'&lt;br /&gt;exec sp_executesql N'INSERT INTO [dbo].[Padri]([NomePadre])&lt;br /&gt;VALUES (@p0) &lt;br /&gt;SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 nvarchar(7)',@p0=N'Padre 1'&lt;br /&gt;--&lt;br /&gt;-- Inserimento nella tabella 'Figli'&lt;br /&gt;exec sp_executesql N'INSERT INTO [dbo].[Figli]([IdPadre], [NomeFiglio])&lt;br /&gt;VALUES (@p0, @p1) &lt;br /&gt;SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 int,@p1 nvarchar(9)',@p0=400,@p1=N'Padre 1 1'&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;---- Entity Framework&lt;br /&gt;-- Inserimenti nella tabella 'Padri'&lt;br /&gt;exec sp_executesql N'insert [dbo].[Padri]([NomePadre])&lt;br /&gt;values (@0)&lt;br /&gt;select [Id]&lt;br /&gt;from [dbo].[Padri]&lt;br /&gt;where @@ROWCOUNT &amp;gt; 0 and [Id] = scope_identity()',N'@0 nvarchar(7)',@0=N'Padre 1'&lt;br /&gt;--&lt;br /&gt;-- Inserimento nella tabella 'Figli'&lt;br /&gt;exec sp_executesql N'insert [dbo].[Figli]([IdPadre], [NomeFiglio])&lt;br /&gt;values (@0, @1)&lt;br /&gt;select [Id]&lt;br /&gt;from [dbo].[Figli]&lt;br /&gt;where @@ROWCOUNT &amp;gt; 0 and [Id] = scope_identity()',N'@0 int,@1 nvarchar(9)',@0=1600,@1=N'Padre 1 1'&lt;/em&gt;&lt;/p&gt; &lt;p&gt;La cosa che salta all'occhio subito è il differente modo di prendere l'&lt;em&gt;id&lt;/em&gt; del record appena inserito e sembra, e lo ripeto, sembra, che sia più performante quello utilizzato dall'Entity Framework anche se, la differenze in peggio tra le due tecnolgie, potrebbero essere invece a livello di codice del Framework nelle sue creazioni delle query.&lt;/p&gt; &lt;p&gt;Ora è tardi per investigare oltre. Ho fatto appena un viaggio di circa tre ore di pullman e sono stanco... Ma prima, si possono tirare conclusioni? Il mio test può essere un caso reale di codice? La stanchezza mi sta spegnendo la ragione... mi fermo qui&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2368/SP-Linq-Entity-Framework-Scrittura.aspx"&gt;&lt;em&gt;SP vs Linq vs Entity Framework in scrittura&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, Entity Framework, .NET Framework 3.5, LINQ, Database</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2368/SP-Linq-Entity-Framework-Scrittura.aspx</guid><slash:comments>9</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2368/SP-Linq-Entity-Framework-Scrittura.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2368.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2368</trackback:ping></item><item><title>Ho fatto pace con l&amp;#39;Entity Framework: un minimo di cache!</title><link>http://blogs.aspitalia.com/az/post2367/Fatto-Pace-Entity-Framework-Minimo-Cache.aspx</link><pubDate>Fri, 22 Aug 2008 12:26:34 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2367" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel &lt;a href="http://blogs.aspitalia.com/az/post2366/entity-framework.-minimo-cache-faceva-schifo.aspx"&gt;post precedente&lt;/a&gt; riscontravo che come due richieste sulla stessa entità venisse gestita dall'Entity Framework in maniera - per me - strana, o per meglio dire, non in modo ottimizzato, perché eseguiva due query perfettamente identiche al database. Ovviamente, come mi ha fatto notare giustamente &lt;a href="http://blogs.aspitalia.com/daniele/"&gt;Daniele&lt;/a&gt; e &lt;a href="http://blogs.aspitalia.com/ricciolo/"&gt;Cristian&lt;/a&gt;, è un comportamento legittimo, e anzi, sarebbe stato strano se avveniva come io lo avevo immaginato.&lt;/p&gt; &lt;p&gt;Scopro solo ora che nativamente esiste una sorta di cache all'interno dell'Entity Framework, ma la cosa deve essere forzata dal programmatore. Riprendendo l'esempio del mio blog precedente, si deve scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestModel.TestEntities context = new TestModel.TestEntities()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int colore = 2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art3 &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var c = context.Colors.Where(w =&amp;gt; w.Id == colore).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.AddToArticles(a); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art4 &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ////////////////////////////////////// &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object obj = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.TryGetObjectByKey( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new System.Data.EntityKey( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string.Format(&amp;quot;{0}.{1}&amp;quot;, context.DefaultContainerName, &amp;quot;Colors&amp;quot;), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Id&amp;quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colore), out obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (obj != null) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // E' presente tra gli oggetti &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = (TestModel.Colors)obj; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Rifaccio la query (*) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = context.Colors.Where(w =&amp;gt; w.Id == colore).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///////////////////////////////////// &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.AddToArticles(a); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;A venirmi in aiuto ci pensa la funzione &lt;em&gt;TryGetObjectByKey&lt;/em&gt; che permette di cercare un oggetto per la sua &lt;em&gt;key&lt;/em&gt; all'interno del &lt;em&gt;context&lt;/em&gt; attuale utilizzato per l'&lt;em&gt;entity framework&lt;/em&gt;. La sintassi è un po' intricata, ma risolve un sacco di dubbi. Ora, avviando l'esempio con il &lt;em&gt;profiler&lt;/em&gt; avviato, vedo che viene eseguita una sola query per recuperare l'&lt;em&gt;entity&lt;/em&gt; del colore...&lt;/p&gt; &lt;p&gt;Ma il &lt;em&gt;TryGetObjectByKey&lt;/em&gt; non solo è in grado di prendere il valore se è già stata trattata, ma esegue lui stesso una query nel caso il valore non fosse presente. Il codice qui sopra potrebbe essere scritto in modo più semplice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestModel.TestEntities context = new TestModel.TestEntities()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int colore = 2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art3 &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestModel.Colors c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object obj = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.TryGetObjectByKey( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new System.Data.EntityKey( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string.Format(&amp;quot;{0}.{1}&amp;quot;, context.DefaultContainerName, &amp;quot;Colors&amp;quot;), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Id&amp;quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colore), out obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = (TestModel.Colors)obj; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.AddToArticles(a); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art4 &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = null; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.TryGetObjectByKey( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new System.Data.EntityKey( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string.Format(&amp;quot;{0}.{1}&amp;quot;, context.DefaultContainerName, &amp;quot;Colors&amp;quot;), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Id&amp;quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colore), out obj); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = (TestModel.Colors)obj; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.AddToArticles(a); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;(*) Il codice non viene mai eseguito.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2367/Fatto-Pace-Entity-Framework-Minimo-Cache.aspx"&gt;&lt;em&gt;Ho fatto pace con l&amp;#39;Entity Framework: un minimo di cache!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Cache, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2367/Fatto-Pace-Entity-Framework-Minimo-Cache.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2367/Fatto-Pace-Entity-Framework-Minimo-Cache.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2367.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2367</trackback:ping></item><item><title>Entity framework... un minimo di cache faceva schifo?</title><link>http://blogs.aspitalia.com/az/post2366/Entity-Framework.-Minimo-Cache-Faceva-Schifo.aspx</link><pubDate>Thu, 21 Aug 2008 16:50:05 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2366" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Leggero. Continuano dei test a tempo perso con l'entity framework. Siccome volevo legare delle proprietà ad una tabella per vedere il comportamento dell'EF (lo chiamo così amichevolmente perché inizio ad avere confidenza con questa tecnologia), ho creato una struttura simile a questa:&lt;/p&gt; &lt;p&gt;&lt;img height="361" alt="diagramma tabelle" src="http://blogs.aspitalia.com/img/andrewz/entityframew.unminimodicachefacevaschifo_10861/image_3.png" width="405" border="0" /&gt; &lt;/p&gt; &lt;p&gt;L'entity framework crea il tutto in modo corretto:&lt;/p&gt; &lt;p&gt;&lt;img height="212" alt="ado entity" src="http://blogs.aspitalia.com/img/andrewz/entityframew.unminimodicachefacevaschifo_10861/image_6.png" width="449" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Nella tabella colors sono presenti dei record così composta:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="200"&gt;Id&lt;/td&gt; &lt;td  width="200"&gt;Color&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;1&lt;/td&gt; &lt;td  width="200"&gt;Black&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;2&lt;/td&gt; &lt;td  width="200"&gt;White&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="200"&gt;3&lt;/td&gt; &lt;td  width="200"&gt;Red&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Per inserire in &lt;em&gt;Articles&lt;/em&gt; nuovi record con un colore corrispondente, mi basta scrivere il codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestModel.TestEntities context = new TestModel.TestEntities()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var c = context.Colors.Where(w =&amp;gt; w.Color == &amp;quot;White&amp;quot;).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Tutto funziona bene. Con il profiler vedo che esegue una prima query per sapere l'&lt;em&gt;id&lt;/em&gt; del colore che sarà poi utilizzato per l'inserimento nella tabella &lt;em&gt;Articoles&lt;/em&gt;. A chiunque sarebbe venuto lo stesso sospetto che è venuto a me: nel caso caso di inserimento di più oggetti &lt;em&gt;Articles&lt;/em&gt;, avendo richiedendo lo stesso colore, come si comporta l'EF?&lt;/p&gt; &lt;p&gt;Ipotizzando questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestModel.TestEntities context = new TestModel.TestEntities()) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string colore = &amp;quot;White&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var c = context.Colors.Where(w =&amp;gt; w.Color == colore).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = new TestModel.Articles(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Article = &amp;quot;Art2 &amp;quot; + DateTime.Now.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = context.Colors.Where(w =&amp;gt; w.Color == colore).First(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.Colors = c; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges(); &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;E' per due volte richiesto il colore &lt;em&gt;bianco&lt;/em&gt;. Avvio il codice, il tutto è inserito correttamente. Guardo con il &lt;em&gt;profiler&lt;/em&gt;... delusione: esegue per ben due volte la query per ottenere l'&lt;em&gt;id&lt;/em&gt; del colore. Una possibile soluzione? Crearsi una logica interna di cache... ok, ma un minimo di cache delle entità l'avrei gradita.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2366/Entity-Framework.-Minimo-Cache-Faceva-Schifo.aspx"&gt;&lt;em&gt;Entity framework... un minimo di cache faceva schifo?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Cache, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2366/Entity-Framework.-Minimo-Cache-Faceva-Schifo.aspx</guid><slash:comments>4</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2366/Entity-Framework.-Minimo-Cache-Faceva-Schifo.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2366.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2366</trackback:ping></item><item><title>Entity Framework e il namespace EntityClient</title><link>http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx</link><pubDate>Sat, 16 Aug 2008 14:01:17 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2363" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sabato pomeriggio. L'entity framework permette, grazie alle classi contenuti nel namespace &lt;em&gt;EntityClient&lt;/em&gt;, la connessione e l'esecuzione di query direttamente sulle &lt;em&gt;entity&lt;/em&gt;, come se si trattasse di un database. Riferendomi sempre a grandi linee agli esempi esposti &lt;a href="http://blogs.aspitalia.com/az/post2359/lentity-framework-framework-3.5-sp.aspx"&gt;qui&lt;/a&gt; e &lt;a href="http://blogs.aspitalia.com/az/post2361/entity-framework-sql-generato.aspx"&gt;qui&lt;/a&gt;, ecco un banale esempio di utilizzo delle classi di questo namespace:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (System.Data.EntityClient.EntityConnection conn = new System.Data.EntityClient.EntityConnection("name=TestEntitiesCode"))&lt;br /&gt; {&lt;br /&gt; conn.Open(); &lt;/em&gt; &lt;p&gt;&lt;em&gt; System.Data.EntityClient.EntityCommand comm= conn.CreateCommand();&lt;br /&gt; comm.CommandText = "select na.Id, na.Names1, na.Books from TestEntitiesCode.Names as na";&lt;br /&gt; System.Data.EntityClient.EntityDataReader re = comm.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);&lt;br /&gt; while (re.Read())&lt;br /&gt; {&lt;br /&gt; Response.Write(string.Format("{0}, {1} = ",&lt;br /&gt; re["Id"], re["Names1"]));&lt;br /&gt; ShowChildren(re["Books"] as System.Data.Common.DbDataReader);&lt;br /&gt; Response.Write("&amp;lt;br /&amp;gt;");&lt;br /&gt; }&lt;br /&gt; re.Close();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;private void ShowChildren(System.Data.Common.DbDataReader children)&lt;br /&gt;{&lt;br /&gt; while (children.Read())&lt;br /&gt; {&lt;br /&gt; Response.Write("[[");&lt;br /&gt; System.Data.IExtendedDataRecord columns = children as System.Data.IExtendedDataRecord;&lt;br /&gt; for (int i = 0; i &amp;lt; columns.FieldCount; i++)&lt;br /&gt; Response.Write(columns&lt;i&gt;.ToString() + ", ");&lt;br /&gt; Response.Write("]]");&lt;br /&gt; }&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Due parole sulla sintassi. In &lt;em&gt;EntityConnection&lt;/em&gt; dobbiamo specificare il nome della classe del nostro model creato con VS2008 (nel dettaglio, aperto il model in VS2008 è sufficiente leggere la proprietà "Entity Container" nelle properties. Nell'esempio viene usata il &lt;em&gt;datareader&lt;/em&gt;. Per le proprietà dirette come l'&lt;em&gt;id&lt;/em&gt; e il name dell'entità &lt;em&gt;Names&lt;/em&gt;, possiamo accedere direttamente con il nome stesso, ma in caso volessimo accedere, come nell'esempio, a una collection di entity come la lista dalla tabella &lt;em&gt;Books&lt;/em&gt;, dobbiamo complicare un po' le cose. L'oggetto presente in &lt;em&gt;re["Books"]&lt;/em&gt; è &lt;em&gt;System.Data.Query.ResultAssembly.BridgeDataReader&lt;/em&gt; ma possiamo passarlo come un DbDataReader come nell'esempio. &lt;p&gt;In ShowChildren possiamo anche andare oltre, leggendo il tipo per ogni column e agire di conseguenza. Ma non ho approfondito oltre ed è sabato anche per me. Comunque, il risultato del codice è il seguente: &lt;p&gt;&lt;em&gt;1, Andrea = [[1, Book 1, ]]&lt;br /&gt;2, Andrea2 = [[2, Book 2, ]][[3, Book 3, ]]&lt;br /&gt;3, Andrea3 = [[4, Book 2, ]][[5, Book 3, ]]&lt;/em&gt; &lt;p&gt;Andando a vedere con il Profiler se ci fossero ancora sorprese, troviamo la query già spiegata &lt;a href="http://blogs.aspitalia.com/az/post2361/entity-framework-sql-generato.aspx"&gt;precedentemente&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx"&gt;&lt;em&gt;Entity Framework e il namespace EntityClient&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2363.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2363</trackback:ping></item></channel></rss>