<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>SQL Server</title>
        <link>http://blogs.ugidotnet.org/martinobordin/category/SQL Server.aspx</link>
        <description>My adventures in the SQL Server world</description>
        <language>it</language>
        <copyright>Martino Bordin</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Intercettare l'esecuzione di query con Entity Framework Code First</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2015/06/16/intercettare-lesecuzione-di-query-con-entity-framework-code-first.aspx</link>
            <description>&lt;p&gt;Recentemente ho avuto la necessità di intercettare e manipolare le query generate da &lt;strong&gt;Entity Framework&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;In particolare dovevo assicurarmi che non venissero estratte dal database le entità la cui proprietà &lt;strong&gt;Disabled&lt;/strong&gt; fosse &lt;strong&gt;true&lt;/strong&gt; (cancellazione logica). &lt;/p&gt;
&lt;p&gt;Dalla versione 6 è possibile innestarsi nella pipeline di EntityFramework ereditando dalla classe &lt;strong&gt;DefaultExpressionVisitor&lt;/strong&gt; ed eseguento l'override del metodo &lt;strong&gt;Visit&lt;/strong&gt;, che si occupa di generare l'expression tree che poi verrà convertito in SQL.&lt;/p&gt;
&lt;p&gt; &lt;iframe src="http://pastebin.com/embed_iframe.php?i=Vbz2dLEv" style="border: currentColor; width: 100%;"&gt; &lt;/iframe&gt;  Sostanzialmente, se il tipo di entità ha una proprietà &lt;strong&gt;Disabled&lt;/strong&gt;, imposto un filtro verificando che non sia uguale a &lt;strong&gt;true&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Per iniettare questo comportamento nella pipeline, basta implementare l'interfaccia &lt;strong&gt;IDbCommandTreeInterceptor&lt;/strong&gt; e aggiungerla mediante il metodo &lt;strong&gt;DbInterception.Add(new SoftDeleteInterceptor()).&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;iframe src="http://pastebin.com/embed_iframe.php?i=KdSyHhME" style="border: currentColor; width: 100%;"&gt; ;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Ora ogni query di EntityFramework non estrarrà le entità disabilitate. &lt;/p&gt;
&lt;p&gt;La cosa è molto utile anche in caso di estrazioni di alberi di oggetti, in quanto se un'entità disabilitata, non si otterrano neanche le entità children, in quanto viene a mancare la condizione di join.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/102014.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2015/06/16/intercettare-lesecuzione-di-query-con-entity-framework-code-first.aspx</guid>
            <pubDate>Tue, 16 Jun 2015 11:21:08 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2015/06/16/intercettare-lesecuzione-di-query-con-entity-framework-code-first.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/102014.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/102014.aspx</trackback:ping>
        </item>
        <item>
            <title>Transazioni attive su SQL Server</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2012/02/28/transazioni-attive-su-sql-server.aspx</link>
            <description>&lt;p&gt;Recentemente  mi è tornato utile avere l’elenco delle transazioni attive con il relativo statemente T-SQL.&lt;/p&gt;  &lt;p&gt;Ecco la query che ho utilizzato:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#000000"&gt;SELECT s_tst.[session_id],       &lt;br /&gt;   s_es.[login_name] AS [Login Name],        &lt;br /&gt;   DB_NAME (s_tdt.database_id) AS [Database],        &lt;br /&gt;   s_tdt.[database_transaction_begin_time] AS [Begin Time],        &lt;br /&gt;   s_tdt.[database_transaction_log_record_count] AS [Log Records],        &lt;br /&gt;   s_tdt.[database_transaction_log_bytes_used] AS [Log Bytes],        &lt;br /&gt;   s_tdt.[database_transaction_log_bytes_reserved] AS [Log Rsvd],        &lt;br /&gt;   s_est.[text] AS [Last T-SQL Text],        &lt;br /&gt;   s_eqp.[query_plan] AS [Last Plan]        &lt;br /&gt;FROM sys.dm_tran_database_transactions s_tdt        &lt;br /&gt;   JOIN sys.dm_tran_session_transactions s_tst        &lt;br /&gt;      ON s_tst.[transaction_id] = s_tdt.[transaction_id]        &lt;br /&gt;   JOIN sys.[dm_exec_sessions] s_es        &lt;br /&gt;      ON s_es.[session_id] = s_tst.[session_id]        &lt;br /&gt;   JOIN sys.dm_exec_connections s_ec        &lt;br /&gt;      ON s_ec.[session_id] = s_tst.[session_id]        &lt;br /&gt;   LEFT OUTER JOIN sys.dm_exec_requests s_er        &lt;br /&gt;      ON s_er.[session_id] = s_tst.[session_id]        &lt;br /&gt;   CROSS APPLY sys.dm_exec_sql_text (s_ec.[most_recent_sql_handle]) AS s_est        &lt;br /&gt;   OUTER APPLY sys.dm_exec_query_plan (s_er.[plan_handle]) AS s_eqp        &lt;br /&gt;ORDER BY [Begin Time] ASC;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Utile nel caso di transazioni bloccate\bloccanti!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100808.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2012/02/28/transazioni-attive-su-sql-server.aspx</guid>
            <pubDate>Tue, 28 Feb 2012 13:48:26 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2012/02/28/transazioni-attive-su-sql-server.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100808.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100808.aspx</trackback:ping>
        </item>
    </channel>
</rss>