<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUUCQng_cCp7ImA9WhRaFEw.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602</id><updated>2012-02-17T00:34:23.648+06:00</updated><category term="promotion" /><category term="crossposted" /><category term="pricing" /><category term="LINQ" /><category term="reflection" /><category term="extensions" /><category term="support" /><category term="publications" /><category term="documentation" /><category term="releases" /><category term="Help Server" /><category term="howto" /><category term="security" /><category term="DataObjects.Net" /><category term="offline" /><category term="community" /><category term="serialization" /><category term="Samples" /><category term="benchmarks" /><category term="MSBuild" /><category term="website" /><category term="sync" /><category term="validation" /><category term="discounts" /><category term="tests" /><category term="feature" /><category term="query optimization" /><category term="polls" /><category term="comparison" /><category term="issues" /><category term="tips" /><category term="abstraction" /><category term="POCO" /><category term="ORM" /><category term="licensing" /><category term="thoughts" /><category term="source code" /><category term="Astoria" /><category term="EF" /><category term="NHibernate" /><category term="ormbattle" /><category term="performance" /><category term="fun" /><category term="ADO.NET Data Services" /><category term="architecture" /><category term="Entity Framework" /><category term="Silverlight" /><category term="announcements" /><title>DataObjects.Net Team Blog</title><subtitle type="html">News, examples, tips, ideas and plans. Thoughts around ORM, .NET and SQL databases.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.dataobjects.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alex Yakunin</name><uri>https://profiles.google.com/106345489701934677304</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-Ii3P-fI0IgI/AAAAAAAAAAI/AAAAAAAAAAA/5y5_oaqwpDg/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>156</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DataObjects" /><feedburner:info uri="dataobjects" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkEGRn05fip7ImA9WhRbGEg.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-6893167541196185474</id><published>2012-02-09T20:48:00.002+06:00</published><updated>2012-02-10T13:23:47.326+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-10T13:23:47.326+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net 4.4.2 RC 2 is published</title><content type="html">Today we are releasing DataObjects.Net 4.4.2 RC 2. The main advantage of DataObjects.Net&amp;nbsp;v4.4.2 branch is migration to the latest version of PostSharp library (v2.1) that significantly improves compilation speed.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;List of changes&lt;/b&gt; comparing to &lt;a href="http://blog.dataobjects.net/2011/12/dataobjectsnet-is-migrated-to-postsharp.html"&gt;DataObjects.Net 4.4.2 RC 1&lt;/a&gt;:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Fixed: &lt;a href="http://support.x-tensive.com/question/4876/query-translation-error-group-by-with-key-of-generic-type"&gt;Query translation error : group by with key of generic type&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;Fixed: &lt;a href="http://support.x-tensive.com/question/4624/some-bug-with-type-cast-if-use-contain"&gt;Bug with type cast if use Contains() method&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;Fixed: DirectSqlAccessor.CreateCommand doesn't bind it to transaction&lt;br /&gt;
&lt;li&gt;Fixed: Memory leak when using &lt;a href="http://help.dataobjects.net/##DataObjects.Net%20v4.4/html/9aed993f-c9cc-4ed4-998b-2e34f13f0679.htm"&gt;compiled queries&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;Improved: Tuple.Format() and TupleDescriptor.Parse() methods are up to 4x faster&lt;br /&gt;
&lt;li&gt;Fixed: Sorting in subqueries is omitted under certain conditions&lt;br /&gt;
&lt;li&gt;Added: &lt;a href="http://support.x-tensive.com/question/4836/option-to-get-less-verbose-exceptions"&gt;Option to disable inclusion of SQL text in thrown exceptions&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;Fixed: Legacy methods Query.Execute() don't work as expected&lt;br /&gt;
&lt;li&gt;Updated: PostSharp is updated to 2.1.5.12 version&lt;br /&gt;
&lt;li&gt;Fixed: &lt;a href="http://support.x-tensive.com/question/4890/syntactic-sugar-shortcuts-in-prefetch-api-not-working"&gt;Syntactic sugar (shortcuts) in Prefetch API doesn't work&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;Fixed: Documentation contains outdated information&lt;br /&gt;
&lt;li&gt;Improved: Project upgrade tool is reworked&lt;br /&gt;
&lt;/ul&gt;&lt;h4&gt;Migration path&lt;/h4&gt;Note: If a previous version of DataObjects.Net was installed (via installer), uninstall it and install the current version of DataObjects.Net.

The easiest and recommended way is to utilize our ProjectUpgrader tool which resides in %DataObjectsInstallationPath%\Common\ProjectUpgrader directory. Select a project and hit "Run" and that's it.

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pzD36-aihLo/TzN624HHYiI/AAAAAAAAAb8/--y6ssVaHAA/s1600/do-pmt.jpg"&gt;&lt;img border="0" height="310" src="http://4.bp.blogspot.com/-pzD36-aihLo/TzN624HHYiI/AAAAAAAAAb8/--y6ssVaHAA/s560/do-pmt.jpg" width="560" style="align:center" /&gt;&lt;/a&gt;&lt;/div&gt;
However, you may also try to update the project file manually. To do that, update references to the latest DataObjects.Net components as well as to PostSharp library.

When it is done, the project should reference Xtensive.Aspects.dll, Xtensive.Core.dll, Xtensive.Orm.dll version 4.4.2.0 and PostSharp.dll version 2.1.0.0
&lt;h4&gt;Where to download&lt;/h4&gt;DataObjects.Net 4.4.2 RC 2 is published and can be downloaded from the &lt;a href="http://dataobjects.net/downloads/default.aspx#eap"&gt;download area&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-6893167541196185474?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=5Zuh-Z3Vn5M:GZ4DkZUy0ys:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=5Zuh-Z3Vn5M:GZ4DkZUy0ys:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=5Zuh-Z3Vn5M:GZ4DkZUy0ys:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=5Zuh-Z3Vn5M:GZ4DkZUy0ys:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=5Zuh-Z3Vn5M:GZ4DkZUy0ys:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=5Zuh-Z3Vn5M:GZ4DkZUy0ys:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=5Zuh-Z3Vn5M:GZ4DkZUy0ys:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=5Zuh-Z3Vn5M:GZ4DkZUy0ys:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/5Zuh-Z3Vn5M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/6893167541196185474/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2012/02/dataobjectsnet-442-rc-2-is-published.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6893167541196185474?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6893167541196185474?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/5Zuh-Z3Vn5M/dataobjectsnet-442-rc-2-is-published.html" title="DataObjects.Net 4.4.2 RC 2 is published" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-pzD36-aihLo/TzN624HHYiI/AAAAAAAAAb8/--y6ssVaHAA/s72-c/do-pmt.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.dataobjects.net/2012/02/dataobjectsnet-442-rc-2-is-published.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYCR3kzfyp7ImA9WhRVEko.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-3543749499383699003</id><published>2012-01-11T16:19:00.000+06:00</published><updated>2012-01-11T16:19:26.787+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-11T16:19:26.787+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><title>DataObjects.Net Extensions, part 2. Reprocessible tasks</title><content type="html">This is the second part of the series of posts about &lt;a href="http://nuget.org/packages/DataObjectsExtensions"&gt;DataObjects.Net Extensions&lt;/a&gt;, created and maintained by Alexander Ovchinnikov, the author of &lt;a href="http://blog.dataobjects.net/2011/04/dataobjectsnet-contribution-program.html"&gt;LINQPad provider for DataObjects.Net&lt;/a&gt;. &lt;br /&gt;
The &lt;a href="http://blog.dataobjects.net/2011/11/dataobjectsnet-extensions-part-1.html"&gt;first part&lt;/a&gt; was about batch server-side update and delete operations and this one is dedicated to reprocessible operations support.&lt;br /&gt;
&lt;h2&gt;Reprocessible operations&lt;/h2&gt;In multi-threaded environment, especially under high load there are pretty good chances of deadlocks, update conflicts, unique constraint violations, etc. Obviously, such cases must be correctly handled and this is where reprocessible tasks take up the challenge. &lt;br /&gt;
&lt;br /&gt;
Which tasks are reprocessable?&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Reprocessible task should represent an &lt;b&gt;autonomous block of logic&lt;/b&gt;, usually a single method or a delegate so it potentially could be executed as many times as needed in case of failure.&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;Reprocessible task must be &lt;b&gt;transactional&lt;/b&gt;, so it shouldn't change the state of the system unless it is successfully completed. Moreover, it shouldn't spoil outermost transaction if any.&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;Reprocessible task should be smart enough to &lt;b&gt;join active session&lt;/b&gt; (if present) or initialize its own one.&lt;br /&gt;
&lt;/ol&gt;
A simple reprocessible task might look like this:

&lt;pre&gt;Domain.Execute(session =&amp;gt;
  {
    // Task logic
  });
&lt;/pre&gt;
Note Action&amp;lt;Session&amp;gt; argument. This is required to have the ability to join current Session or open a new one. However, this sort of declaration doesn't provide any way to manage conditions of reproccesibility and the transaction isolation level to follow.

Overloads of the Domain.Execute extension method with full list of arguments provide such options:

&lt;pre&gt;void Execute(IsolationLevel isolationLevel, 
             IExecuteActionStrategy strategy, 
             Action&amp;lt;Session&amp;gt; action);

T Execute&amp;lt;T&amp;gt;(IsolationLevel isolationLevel,
             IExecuteActionStrategy strategy,
             Func&amp;lt;Session, T&amp;gt; action);
&lt;/pre&gt;
An implementor of IExecuteActionStrategy is capable of how to react to exceptions thrown, how many attempts to execute the task to make and so on.
&lt;h2&gt;Task execution strategies&lt;/h2&gt;There are dozens of ways how to execute the tasks, that's why the strategy is an interface; you may want to implement your own strategy for some specific scenarios. However, DataObjects.Net Extensions contains several ready-to-use strategies for the most common cases:
&lt;ol&gt;&lt;li&gt;HandleReprocessableExceptionStrategy&lt;/li&gt;
&lt;li&gt;HandleUniqueConstraintViolationStrategy&lt;/li&gt;
&lt;li&gt;NoReprocessStrategy&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;HandleReprocessableExceptionStrategy&lt;/h3&gt;The strategy is used to handle any ReprocessibleException, which in turn is a erroneous situation that can be recovered by rolling back active transaction and reprocessing all actions in a new one. This strategy is applicable for the majority of scenarios and is recommended as a default one.
&lt;pre&gt;Domain.Execute(
    ExecuteActionStrategy.Reprocessable,
    session =&gt;
        { 
            // do some stuff
        });
&lt;/pre&gt;
The default instance of HandleReprocessableExceptionStrategy can be accessed via &lt;b&gt;ExecuteActionStrategy.Reprocessable&lt;/b&gt; static property. Default number of attempts is 5.
&lt;h3&gt;HandleUniqueConstraintViolationStrategy&lt;/h3&gt;The strategy is used to handle either ReprocessibleException or UniqueConstraintViolationException as latter one doesn't inherit ReprocessibleException. The strategy extends HandleReprocessableExceptionStrategy and might be especially helpful in scenarios "Add or Update entity". 
&lt;pre&gt;Domain.Execute(
    ExecuteActionStrategy.UniqueConstraintViolation,
    session =&gt;
        { 
            var counter = session.Query.SingleOrDefault&amp;lt;Counter&amp;gt;(ID);
            if (counter == null) {
                counter = new Counter(session, ID);
            }
            counter.Value++;
        });
&lt;/pre&gt;
The default instance of HandleUniqueConstraintViolationStrategy can be accessed via &lt;b&gt;ExecuteActionStrategy.UniqueConstraintViolation&lt;/b&gt; static property. Default number of attempts is  5. 
&lt;h3&gt;NoReprocessStrategy&lt;/h3&gt;This strategy doesn't support reprocessing. It should be used in scenarios where reprocessing is not desirable or might lead to erroneous results, for example, a task operates with non-transactional objects or services:
&lt;pre&gt;Domain.Execute(
    ExecuteActionStrategy.NoReprocess,
    session =&gt;
        { 
            // on transaction rollback results of these methods can't be reverted
            SendMail();
            CreateAFile();
            DeleteAFile();
            // database-related actions
        });
&lt;/pre&gt;
The default instance of NoReprocessStrategy can be accessed via &lt;b&gt;ExecuteActionStrategy.NoReprocess&lt;/b&gt; static property.
&lt;h3&gt;Custom reprocessible strategies&lt;/h3&gt;To utilize your own reprocessible strategy, use this pattern:
&lt;pre&gt;Domain.Execute(
    new MyFancyReprocessibleStrategy(),
    session =&gt;
        { 
            // some actions
        });
&lt;/pre&gt;The implementation of custom reprocessible strategy might be based on ExecuteActionStrategy class which is the base class for the above-mentioned strategies and is included into DataObjects.Net Extensions or can be made from scratch.
&lt;br/&gt;&lt;br/&gt;
Enjoy the power of DataObjects.Net Extensions, employ &lt;a href="http://blog.dataobjects.net/2011/11/dataobjectsnet-extensions-part-1.html"&gt;server-side batches&lt;/a&gt; and task reprocessing in your projects.
&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;
P.S.&lt;br/&gt;
How to install the extension is described in the &lt;a href="http://blog.dataobjects.net/2011/11/dataobjectsnet-extensions-part-1.html"&gt;first part&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-3543749499383699003?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NakJ3dUrisk:R2ugc7gMufo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NakJ3dUrisk:R2ugc7gMufo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=NakJ3dUrisk:R2ugc7gMufo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NakJ3dUrisk:R2ugc7gMufo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=NakJ3dUrisk:R2ugc7gMufo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NakJ3dUrisk:R2ugc7gMufo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NakJ3dUrisk:R2ugc7gMufo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=NakJ3dUrisk:R2ugc7gMufo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/NakJ3dUrisk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/3543749499383699003/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2012/01/dataobjectsnet-extensions-part-2.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3543749499383699003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3543749499383699003?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/NakJ3dUrisk/dataobjectsnet-extensions-part-2.html" title="DataObjects.Net Extensions, part 2. Reprocessible tasks" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2012/01/dataobjectsnet-extensions-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cBR308eip7ImA9WhRWEUo.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-8858878397889568319</id><published>2011-12-29T21:04:00.000+06:00</published><updated>2011-12-29T21:04:16.372+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-29T21:04:16.372+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net is migrated to PostSharp 2.1</title><content type="html">As it was announced earlier, right after &lt;a href="http://blog.dataobjects.net/2011/12/dataobjectsnet-v438-v441-are-released.html"&gt;the release of DataObjects.Net 4.4.1&lt;/a&gt; the project was migrated to PostSharp 2.1. According to the &lt;a href="http://www.sharpcrafters.com/blog/post/Announcing-PostSharp-21-RTM.aspx"&gt;PostSharp 2.1 release notes&lt;/a&gt;, one of many positive changes of the migration is noticeable compile-time performance boost. &lt;br/&gt;&lt;br /&gt;
For example, after the migration a DataObjects.Net tests project with hundreds of models is being compiled 2 times faster. I hope you'll notice the same effect. Say thanks to Gael, the author of PostSharp for such a sweet update.&lt;br /&gt;
&lt;h4&gt;Changes&lt;/h4&gt;This version of DataObjects.Net contains all new features and bugfixes from &lt;a href="http://blog.dataobjects.net/2011/12/dataobjectsnet-v438-v441-are-released.html"&gt;the previous version&lt;/a&gt;, the only difference is that the project is migrated from PostSharp 2.0 to PostSharp 2.1.&lt;br /&gt;
&lt;h4&gt;Migration path&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;If a previous version of DataObjects.Net was installed (I mean through installer), uninstall it and install the current version of DataObjects.Net.&lt;br /&gt;
&lt;li&gt;In your projects update references to the latest DataObjects.Net components as well as to PostSharp library.&lt;br /&gt;
&lt;/ul&gt;Now your projects should reference Xtensive.Aspects.dll, Xtensive.Core.dll, Xtensive.Orm.dll version 4.4.2 and PostSharp.dll version 2.1.

&lt;h4&gt;Where to download&lt;/h4&gt;DataObjects.Net 4.4.2 is published as a release candidate and can be downloaded from the &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-4"&gt;download area&lt;/a&gt;.

&lt;h4&gt;Big Winter Sale&lt;/h4&gt;The sale is going to its end, as 2011 year does. So if you are still thinking, these are the last days to lock your savings. Till the end of 2011 year &lt;a href="http://blog.dataobjects.net/2011/12/big-winter-sale.html"&gt;we are offering 50% off&lt;/a&gt;. Beyond the great product, you're also gaining 1 year of fast and professional support, new releases, nightly builds and more.
&lt;br /&gt;
&lt;br/&gt;
P.S.&lt;br/&gt;
This is likely to be the last post in this year.&lt;br/&gt;
I'm wishing you a wonderful 2012 year, full of hope and optimism.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-8858878397889568319?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=cc3WUl-qgV0:mlwhR3A8u2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=cc3WUl-qgV0:mlwhR3A8u2c:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=cc3WUl-qgV0:mlwhR3A8u2c:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=cc3WUl-qgV0:mlwhR3A8u2c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=cc3WUl-qgV0:mlwhR3A8u2c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=cc3WUl-qgV0:mlwhR3A8u2c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=cc3WUl-qgV0:mlwhR3A8u2c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=cc3WUl-qgV0:mlwhR3A8u2c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/cc3WUl-qgV0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/8858878397889568319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/12/dataobjectsnet-is-migrated-to-postsharp.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/8858878397889568319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/8858878397889568319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/cc3WUl-qgV0/dataobjectsnet-is-migrated-to-postsharp.html" title="DataObjects.Net is migrated to PostSharp 2.1" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/12/dataobjectsnet-is-migrated-to-postsharp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCSHs4eyp7ImA9WhRXE00.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-8257910652683081829</id><published>2011-12-19T19:14:00.000+06:00</published><updated>2011-12-19T19:14:29.533+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T19:14:29.533+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net v.4.3.8 &amp; v.4.4.1 are released</title><content type="html">Today, 19th December, 2011 we are announcing the final release of DataObjects.Net 4.3.8 and 4.4.1, available for download on our &lt;a href="http://dataobjects.net/downloads/default.aspx"&gt;web site&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Changes in this version are listed in these posts:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.dataobjects.net/2011/11/upcoming-major-update.html"&gt;Upcoming major update&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href="http://blog.dataobjects.net/2011/11/precise-control-over-indexes.html"&gt;Precise control over indexes&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href="http://blog.dataobjects.net/2011/12/dataobjectsnet-438-441-release.html"&gt;Minor fixes in Release Candidate 2&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href="http://blog.dataobjects.net/2011/11/setting-default-values-for-persistent.html"&gt;Setting default values for persistent properties&lt;/a&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;h4&gt;What's next?&lt;/h4&gt;As it was promised, the next version in 4.3 &amp; 4.4 branches will be migrated to &lt;a href="http://www.sharpcrafters.com/blog/post/Announcing-PostSharp-21-RTM.aspx"&gt;PostSharp 2.1 RTM&lt;/a&gt;. All the functionality will be the same, except the version of PostSharp. It is expected that the next version will be ready within a week or two.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-8257910652683081829?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=lUlD4ox2OTA:ZkJGDnPj5ic:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=lUlD4ox2OTA:ZkJGDnPj5ic:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=lUlD4ox2OTA:ZkJGDnPj5ic:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=lUlD4ox2OTA:ZkJGDnPj5ic:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=lUlD4ox2OTA:ZkJGDnPj5ic:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=lUlD4ox2OTA:ZkJGDnPj5ic:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=lUlD4ox2OTA:ZkJGDnPj5ic:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=lUlD4ox2OTA:ZkJGDnPj5ic:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/lUlD4ox2OTA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/8257910652683081829/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/12/dataobjectsnet-v438-v441-are-released.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/8257910652683081829?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/8257910652683081829?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/lUlD4ox2OTA/dataobjectsnet-v438-v441-are-released.html" title="DataObjects.Net v.4.3.8 &amp; v.4.4.1 are released" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/12/dataobjectsnet-v438-v441-are-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUFSXY-eCp7ImA9WhRQF0U.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-68705006464766292</id><published>2011-12-13T18:43:00.000+06:00</published><updated>2011-12-13T18:43:38.850+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T18:43:38.850+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>Setting default values for persistent properties</title><content type="html">While DataObjects.Net 4.4.1 &amp; 4.3.8 Final installers are being prepared and tested, here is one more post about one not so well known feature of effective domain modelling and how that feature is extended in the upcoming release.&lt;br /&gt;
&lt;br /&gt;
DataObjects.Net includes a set of rules for defining the default value for a persistent property.&lt;br /&gt;
The rules are the following: &lt;br /&gt;
&lt;br /&gt;
Let &lt;b&gt;T&lt;/b&gt; is the type of a persistent property, then:&lt;br /&gt;
&lt;h4&gt;1. T is a primitive type&lt;/h4&gt;If T is a primitive type, Guid or String then the default value for the property is default(T) and the type of the underlying column is T.&lt;br /&gt;
&lt;pre&gt;public class Animal : Entity {
...
[Field]
&lt;b&gt;public int Age { get; set; }&lt;/b&gt;

CREATE TABLE Animal (
...
&lt;b&gt;[Age] [int] NOT NULL&lt;/b&gt;
&lt;/pre&gt;&lt;h4&gt;2. T is Nullable&amp;lt;&amp;gt;&lt;/h4&gt;If T is Nullable&amp;lt;&amp;gt; then the default value is NULL and the type of the underlying column is Nullable T.&lt;br /&gt;
&lt;pre&gt;public class Animal : Entity {
...
[Field]
&lt;b&gt;public int? Legs { get; set; }&lt;/b&gt;

CREATE TABLE Animal (
...
&lt;b&gt;[Legs] [int] NULL&lt;/b&gt;
&lt;/pre&gt;&lt;h4&gt;3. T is a reference type&lt;/h4&gt;If T is a reference type then the default value is NULL and the type of the underlying column is the type of primary key of the referenced Entity.&lt;br /&gt;
&lt;pre&gt;public class Animal : Entity {
...
[Field]
&lt;b&gt;public Person Owner { get; set; }&lt;/b&gt;

CREATE TABLE Animal (
...
&lt;b&gt;[Owner.Id] [int] NULL&lt;/b&gt;
&lt;/pre&gt;&lt;br /&gt;
These rules are more or less obvious and straightforward but what if the overwhelming majority of animals in your application universe have 4 legs and you don't want to set this property manually again and again? Or there should not be homeless animals? Then I guess, you should have the opportunity to override these rules.&lt;br /&gt;
&lt;br /&gt;
This can be done with the help of &lt;b&gt;[Field]&lt;/b&gt; attribute.&lt;br /&gt;
&lt;h4&gt;1. Setting default value for a primitive persistent property&lt;/h4&gt;&lt;pre&gt;public class Animal : Entity {
...
[Field(&lt;b&gt;DefaultValue = 4&lt;/b&gt;)]
public int? Legs { get; set; }

CREATE TABLE Animal (
...
[Legs] [int] NULL
...
&lt;b&gt;ALTER TABLE [dbo].[Animal] ADD CONSTRAINT [DF_Animal_Legs]  DEFAULT ((4)) FOR [Legs]&lt;/b&gt;
&lt;/pre&gt;&lt;h4&gt;2. Changing nullability of a reference field.&lt;/h4&gt;&lt;pre&gt;public class Animal : Entity {
...
[Field(&lt;b&gt;Nullable = false&lt;/b&gt;)]
public Person Owner { get; set; }

CREATE TABLE Animal (
...
&lt;b&gt;[Owner.Id] [int] NOT NULL&lt;/b&gt;
&lt;/pre&gt;This setting leads to NOT NULL column which means that the value of the property must be set prior to any Session.Persist() call while constructing the Animal entity. Therefore, the right way to set such properties is inside entity's constructor, before executing any queries.&lt;br /&gt;
&lt;h4&gt;3. Setting default value for a reference persistent property.&lt;/h4&gt;&lt;i&gt;Note, this feature is implemented in the upcoming version of DataObjects.Net (by upcoming I mean 4.3.8 or 4.4.1 branches).&lt;/i&gt;&lt;br /&gt;
&lt;pre&gt;public class Animal : Entity {
...
[Field(&lt;b&gt;DefaultValue = 1&lt;/b&gt;)]  // 1 here is the key of the default animal owner
public Person Owner { get; set; }

CREATE TABLE Animal (
...
[Owner.Id] [int] NULL
...
&lt;b&gt;ALTER TABLE [dbo].[Animal] ADD CONSTRAINT [DF_Animal_OwnerId]  DEFAULT ((1)) FOR [Owner.Id]&lt;/b&gt;
&lt;/pre&gt;This makes sense in a scenario when the key of the default referenced entity is already known on a compilation step or it is a well-known constant identifier so there is an Entity with that key in the domain.&lt;br /&gt;
&lt;br /&gt;
I hope these little tricks will help you in modelling your domains with even less efforts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-68705006464766292?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6RsW4-Cx5q8:LvQsjYQcH6o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6RsW4-Cx5q8:LvQsjYQcH6o:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=6RsW4-Cx5q8:LvQsjYQcH6o:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6RsW4-Cx5q8:LvQsjYQcH6o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=6RsW4-Cx5q8:LvQsjYQcH6o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6RsW4-Cx5q8:LvQsjYQcH6o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6RsW4-Cx5q8:LvQsjYQcH6o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=6RsW4-Cx5q8:LvQsjYQcH6o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/6RsW4-Cx5q8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/68705006464766292/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/11/setting-default-values-for-persistent.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/68705006464766292?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/68705006464766292?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/6RsW4-Cx5q8/setting-default-values-for-persistent.html" title="Setting default values for persistent properties" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/11/setting-default-values-for-persistent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBRnY7fCp7ImA9WhRQEEQ.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-8718474222859933532</id><published>2011-12-05T20:45:00.000+06:00</published><updated>2011-12-05T20:45:57.804+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-05T20:45:57.804+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net 4.3.8 &amp; 4.4.1 Release Candidates 2 are out</title><content type="html">DataObjects.Net 4.3.8 RC 2 &amp; 4.4.1 RC 2 are &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-4"&gt;available for download&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This release includes a minor fix in SQL Server &amp; Oracle providers. No special actions for migration to the new version are required except updating the references.&lt;br /&gt;
&lt;br /&gt;
Just as a reminder: the list of fixes, updates and new features is &lt;a href="http://blog.dataobjects.net/2011/11/upcoming-major-update.html"&gt;here&lt;/a&gt;, the detailed overview of index management-related features is &lt;a href="http://blog.dataobjects.net/2011/11/precise-control-over-indexes.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
We are waiting for your feedback! Write to &lt;a href="mailto:support@x-tensive.com"&gt;support@x-tensive.com&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Thank you!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-8718474222859933532?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=ED4wABPpP3I:WV7e3nabVCA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=ED4wABPpP3I:WV7e3nabVCA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=ED4wABPpP3I:WV7e3nabVCA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=ED4wABPpP3I:WV7e3nabVCA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=ED4wABPpP3I:WV7e3nabVCA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=ED4wABPpP3I:WV7e3nabVCA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=ED4wABPpP3I:WV7e3nabVCA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=ED4wABPpP3I:WV7e3nabVCA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/ED4wABPpP3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/8718474222859933532/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/12/dataobjectsnet-438-441-release.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/8718474222859933532?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/8718474222859933532?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/ED4wABPpP3I/dataobjectsnet-438-441-release.html" title="DataObjects.Net 4.3.8 &amp; 4.4.1 Release Candidates 2 are out" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/12/dataobjectsnet-438-441-release.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUADRXkyeip7ImA9WhRRF04.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-4574599613688420138</id><published>2011-12-01T16:02:00.000+06:00</published><updated>2011-12-01T16:02:54.792+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T16:02:54.792+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="discounts" /><category scheme="http://www.blogger.com/atom/ns#" term="promotion" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Big Winter Sale</title><content type="html">&lt;img border="0" src="http://dataobjects.net/img/do-discount-prices.png" width="650px" /&gt;&lt;br/&gt;&lt;br /&gt;
We are glad to announce that Big Winter Sale has started on the 1st of December and will last till the end of the year. During this time you get &lt;b&gt;50% off&lt;/b&gt; any edition of &lt;a href="http://dataobjects.net/prices.aspx"&gt;DataObjects.Net&lt;/a&gt; and &lt;a href="http://x-tensive.com/Products/HS/"&gt;Help Server&lt;/a&gt;. To apply this 50% special to your order, just enter &lt;b&gt;DEC2011PROMO&lt;/b&gt; coupon code at the shopping cart or product checkout page.&lt;br&gt;&lt;br /&gt;
Should you have any questions, please email to &lt;a href="mailto:sales@x-tensive.com"&gt;sales@x-tensive.com&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Sincerely,&lt;br /&gt;
Xtensive.com Sales Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-4574599613688420138?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NUFggwx_G7M:4trDBskkvQo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NUFggwx_G7M:4trDBskkvQo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=NUFggwx_G7M:4trDBskkvQo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NUFggwx_G7M:4trDBskkvQo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=NUFggwx_G7M:4trDBskkvQo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NUFggwx_G7M:4trDBskkvQo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=NUFggwx_G7M:4trDBskkvQo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=NUFggwx_G7M:4trDBskkvQo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/NUFggwx_G7M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/4574599613688420138/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/12/big-winter-sale.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/4574599613688420138?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/4574599613688420138?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/NUFggwx_G7M/big-winter-sale.html" title="Big Winter Sale" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/12/big-winter-sale.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AMSH8yfSp7ImA9WhRRFEU.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-9168655526975232160</id><published>2011-11-28T17:38:00.000+06:00</published><updated>2011-11-28T18:03:09.195+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-28T18:03:09.195+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="website" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net 4.3.8 RC 1 &amp; 4.4.1 RC 1 are published</title><content type="html">Today DataObjects.Net 4.3.8 RC 1 &amp; DataObjects.Net 4.4.1 RC 1 are published and &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-4"&gt;available for download&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Just as a reminder: the list of fixes, updates and new features is &lt;a href="http://blog.dataobjects.net/2011/11/upcoming-major-update.html"&gt;here&lt;/a&gt;, the detailed overview of index management-related features is &lt;a href="http://blog.dataobjects.net/2011/11/precise-control-over-indexes.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
No special actions for migration to the new version are required except updating the references.&lt;br /&gt;
&lt;br /&gt;
We are waiting for your feedback! Write to us to &lt;a href="mailto:support@x-tensive.com"&gt;support@x-tensive.com&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Thank you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-9168655526975232160?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gdmoxd7vfz0:gcpzg6s4E8s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gdmoxd7vfz0:gcpzg6s4E8s:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=gdmoxd7vfz0:gcpzg6s4E8s:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gdmoxd7vfz0:gcpzg6s4E8s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=gdmoxd7vfz0:gcpzg6s4E8s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gdmoxd7vfz0:gcpzg6s4E8s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gdmoxd7vfz0:gcpzg6s4E8s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=gdmoxd7vfz0:gcpzg6s4E8s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/gdmoxd7vfz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/9168655526975232160/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/11/dataobjectsnet-438-rc-1-441-rc-1-are.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/9168655526975232160?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/9168655526975232160?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/gdmoxd7vfz0/dataobjectsnet-438-rc-1-441-rc-1-are.html" title="DataObjects.Net 4.3.8 RC 1 &amp; 4.4.1 RC 1 are published" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/11/dataobjectsnet-438-rc-1-441-rc-1-are.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8EQnw9fyp7ImA9WhRREU4.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-7271073688813030196</id><published>2011-11-24T18:22:00.001+06:00</published><updated>2011-11-24T18:46:43.267+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-24T18:46:43.267+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net 4.5 Beta 4 binaries are updated</title><content type="html">DataObjects.Net 4.5 Beta 4 package is updated to the latest revision, incorporating all the fixes and features from branches 4.3 &amp; 4.4. The updated binaries can be downloaded from &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-5"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-7271073688813030196?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=XnjpXVxgUg4:p1X13IG2HPU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=XnjpXVxgUg4:p1X13IG2HPU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=XnjpXVxgUg4:p1X13IG2HPU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=XnjpXVxgUg4:p1X13IG2HPU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=XnjpXVxgUg4:p1X13IG2HPU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=XnjpXVxgUg4:p1X13IG2HPU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=XnjpXVxgUg4:p1X13IG2HPU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=XnjpXVxgUg4:p1X13IG2HPU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/XnjpXVxgUg4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/7271073688813030196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/11/dataobjectsnet-45-beta-4-binaries-are.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/7271073688813030196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/7271073688813030196?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/XnjpXVxgUg4/dataobjectsnet-45-beta-4-binaries-are.html" title="DataObjects.Net 4.5 Beta 4 binaries are updated" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/11/dataobjectsnet-45-beta-4-binaries-are.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEGSXozeyp7ImA9WhRSGEs.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-3350102477391238470</id><published>2011-11-21T13:54:00.000+06:00</published><updated>2011-11-21T14:03:48.483+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-21T14:03:48.483+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><title>DataObjects.Net Extensions, part 1</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://nuget.org/Media/Default/Packages/DataObjectsExtensions/1.0/DO-icon-64-64.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="96" width="96" src="http://nuget.org/Media/Default/Packages/DataObjectsExtensions/1.0/DO-icon-64-64.png" /&gt;&lt;/a&gt;&lt;/div&gt;I'm writing this post on behalf of Alexander Ovchinnikov who is the author of DataObjects.Net Extensions project. Earlier Alexander developed &lt;a href="http://blog.dataobjects.net/2011/04/dataobjectsnet-contribution-program.html"&gt;LINQPad provider for DataObjects.Net&lt;/a&gt;, which is included into standard DataObjects.Net installation package starting from version 4.5, so he is deservedly one of the most productive contributors in DataObjects.Net community.&lt;br /&gt;
&lt;br /&gt;
This project is officially called DataObjects.Net Extensions and is distributed under &lt;a href="http://en.wikipedia.org/wiki/Mit_license"&gt;MIT license&lt;/a&gt;. Source code is available on &lt;a href="https://github.com/proff/DOExtensions"&gt;github&lt;/a&gt;. The latest version of DataObjects.Net Extensions contains 2 main set of features:&lt;br /&gt;
- Batch server-side update and delete operations&lt;br /&gt;
- Operation reprocessing&lt;br /&gt;
&lt;br /&gt;
In this post I'll describe the first part, batch server-side update and delete operations.&lt;br /&gt;
&lt;h2&gt;How to install the extension&lt;/h2&gt;1. The extension is distributed in a form of NuGet package, so to use it you should install &lt;a href="http://docs.nuget.org/docs/start-here/installing-nuget"&gt;NuGet Manager&lt;/a&gt; if you haven't installed it already. As far as I know, Visual Studio 2010 SP 1 already includes this manager by default.&lt;br /&gt;
&lt;br /&gt;
2. Open the desired solution and in the context menu select "Manage NuGet packages..."&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-If7pshRHthc/TskEvUIm9II/AAAAAAAAAa8/ORH1pDX6zKo/s1600/1.png" imageanchor="1"&gt;&lt;img border="0" height="611" src="http://3.bp.blogspot.com/-If7pshRHthc/TskEvUIm9II/AAAAAAAAAa8/ORH1pDX6zKo/s640/1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
3. Search for "DataObjectsExtensions" package&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xLQaQm_SLr0/TskF4Z0bMII/AAAAAAAAAbI/m_TqQOckcvQ/s1600/2.png" imageanchor="1"&gt;&lt;img border="0" height="427" src="http://4.bp.blogspot.com/-xLQaQm_SLr0/TskF4Z0bMII/AAAAAAAAAbI/m_TqQOckcvQ/s640/2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
4. Click "Install", choose projects to add the reference to and click "OK".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-s-Tk6bIecJ4/TskGXsJMllI/AAAAAAAAAbU/tyQMEt88apU/s1600/3.png" imageanchor="1"&gt;&lt;img border="0" height="432" src="http://2.bp.blogspot.com/-s-Tk6bIecJ4/TskGXsJMllI/AAAAAAAAAbU/tyQMEt88apU/s640/3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
5. Check that the package is successfully installed and start using it.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0wrMJjGNFdQ/TskG5Ul4YRI/AAAAAAAAAbg/05LSoWEMMmE/s1600/5.png" imageanchor="1"&gt;&lt;img border="0" height="556" src="http://1.bp.blogspot.com/-0wrMJjGNFdQ/TskG5Ul4YRI/AAAAAAAAAbg/05LSoWEMMmE/s640/5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Sample domain model&lt;/h2&gt;This model will be used in code samples.&lt;br /&gt;
&lt;pre&gt;[HierarchyRoot]
    public class Bar : Entity {

        public Bar(Session session) : base(session){}

        [Field, Key]
        public int Id { get; set; }

        [Field]
        public string Name { get; set; }

        [Field]
        public int Count { get; set; }

        [Field]
        public string Description { get; set; }
    }

    [HierarchyRoot]
    [Index("Name", Unique = true)]
    public class Foo : Entity{

        public Foo(Session session) : base(session){}

        public Foo(Session session, int id) : base(session, id){}

        [Field, Key]
        public int Id { get; set; }

        [Field]
        public string Name { get; set; }

        [Field]
        [Association("Foo")]
        public Bar Bar { get; set; }
    }
&lt;/pre&gt;&lt;h2&gt;Batch server-side operations&lt;/h2&gt;&lt;h4&gt;Why they are important?&lt;/h4&gt;Well, Captain Obvious to the rescue, sometimes there could be a scenario when a set of records needs to be updated without fetching them on client. There might be various reasons for that such as performance issues, limitations of business logic, etc. In such cases users have to utilize old good plain SQL to execute "UPDATE" or "DELETE" commands via underlying ADO.NET providers. But while this is not always convenient, this also could lead to potentially erroneous results because as soon as domain model changes, it becomes out of sync with these SQL commands.&lt;br /&gt;
&lt;br /&gt;
DataObjects.Net Extensions sorts out the problem providing a set of IQueryable extension methods that  are translated to the desired UPDATE or DELETE commands. For instance:&lt;br /&gt;
&lt;pre&gt;Query.All&amp;lt;Bar&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  .Set(a =&amp;gt; a.Count, 2)
  .Set(a =&amp;gt; a.Name, a =&amp;gt; a.Name + "suffix")
  .Update();
&lt;/pre&gt;Listed below are some scenarios which you might encounter while using the package. Every case is followed by the corresponding translation to SQL.&lt;br /&gt;
&lt;h4&gt;Updating persistent property with constant value&lt;/h4&gt;&lt;pre&gt;Query.All&amp;lt;Bar&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  &lt;b&gt;.Set(a =&amp;gt; a.Count, 2)&lt;/b&gt;
  .Update();
&lt;/pre&gt;is translated to:&lt;br /&gt;
&lt;pre&gt;DECLARE @p0 Int SET @p0 = 2
UPDATE [dbo].[Bar]
SET [Count] = @p0
FROM [dbo].[Bar] AS j0 INNER JOIN (
SELECT
  [a].[Id]
FROM
  [dbo].[Bar] [a]
WHERE
  ([a].[Id] = 1)
) AS j1 ON (j0.[Id] = j1.[Id])
&lt;/pre&gt;&lt;h4&gt;Updating persistent property with expression, computed on server&lt;/h4&gt;&lt;pre&gt;Query.All&amp;lt;Bar&amp;gt;()
  .Where(a =&amp;gt; a.Id==1)
  &lt;b&gt;.Set(a =&amp;gt; a.Count, a =&amp;gt; a.Description.Length + a.Count * 2)&lt;/b&gt;
  .Update();
&lt;/pre&gt;is translated to:&lt;br /&gt;
&lt;pre&gt;UPDATE [dbo].[Bar]
SET [Count] = ((DATALENGTH([Description]) / 2) + ([Count] * 2))
FROM [dbo].[Bar] AS j0 INNER JOIN (
SELECT
  [a].[Id]
FROM
  [dbo].[Bar] [a]
WHERE
  ([a].[Id] = 1)
) AS j1 ON (j0.[Id] = j1.[Id])
&lt;/pre&gt;&lt;h4&gt;Setting a reference to an entity that is already loaded into Session&lt;/h4&gt;&lt;pre&gt;// Emulating entity loading
var bar = Query.Single&amp;lt;Bar&amp;gt;(1);

Query.All&amp;lt;Foo&amp;gt;()
  .Where(a =&amp;gt; a.Id == 2)
  &lt;b&gt;.Set(a =&amp;gt; a.Bar, bar)&lt;/b&gt;
  .Update();
&lt;/pre&gt;is translated to:&lt;br /&gt;
&lt;pre&gt;DECLARE @p0 Int SET @p0 = 1
UPDATE [dbo].[Foo]
SET [Bar.Id] = @p0
FROM [dbo].[Foo] AS j0 INNER JOIN (
SELECT
  [a].[Id]
FROM
  [dbo].[Foo] [a]
WHERE
  ([a].[Id] = 2)
) AS j1 ON (j0.[Id] = j1.[Id])
&lt;/pre&gt;&lt;h4&gt;Setting a reference to an entity that is not loaded into Session, 1st way&lt;/h4&gt;&lt;pre&gt;Query.All&amp;lt;Foo&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  &lt;b&gt;.Set(a =&amp;gt; a.Bar, a =&amp;gt; Query.Single&amp;lt;Bar&amp;gt;(1))&lt;/b&gt;
  .Update();
&lt;/pre&gt;In this case DataObjectsExtensions are smart enough to extract the value of key from Query.Single method argument and use that value in command translation:&lt;br /&gt;
&lt;pre&gt;DECLARE @p0 Int SET @p0 = 1
UPDATE [dbo].[Foo]
SET [Bar.Id] = @p0
FROM [dbo].[Foo] AS j0 INNER JOIN (
SELECT
  [a].[Id]
FROM
  [dbo].[Foo] [a]
WHERE
  ([a].[Id] = 1)
) AS j1 ON (j0.[Id] = j1.[Id])
&lt;/pre&gt;All overloads of &lt;b&gt;Query.Single, Query.SingleOrDefault&lt;/b&gt; methods are also supported.&lt;br /&gt;
&lt;h4&gt;Setting a reference to an entity that is not loaded into Session, 2nd way&lt;/h4&gt;&lt;pre&gt;Query.All&amp;lt;Foo&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  &lt;b&gt;.Set(a =&amp;gt; a.Bar, a =&amp;gt; Query.All&amp;lt;Bar&amp;gt;().Single(b =&amp;gt; b.Name == "test"))&lt;/b&gt;
  .Update();
&lt;/pre&gt;is translated to:&lt;br /&gt;
&lt;pre&gt;UPDATE [dbo].[Foo]
SET [Bar.Id] = (SELECT TOP 1 [a].[Id] FROM [dbo].[Bar] [a] WHERE ([a].[Name] = N'test'))
FROM [dbo].[Foo] AS j0 INNER JOIN (
SELECT
  [a].[Id]
FROM
  [dbo].[Foo] [a]
WHERE
  ([a].[Id] = 1)
) AS j1 ON (j0.[Id] = j1.[Id])
&lt;/pre&gt;All overloads of &lt;b&gt;Queryable.Single, Queryable.SingleOrDefault, Queryable.First, Queryable.FirstOrDefault&lt;/b&gt; methods are supported.&lt;br /&gt;
Note, this way always leads to a subquery, so if key of referenced entity is known, it is strongly recommended to use the 1st way.&lt;br /&gt;
&lt;h4&gt;Constructing update expressions of the fly&lt;/h4&gt;&lt;b&gt;Set&lt;/b&gt; extension method can be used in scenarios when the update expression is constructed in runtime, for example:&lt;br /&gt;
&lt;pre&gt;bool condition = CheckCondition();
var query = Query.All()&amp;lt;Bar&amp;gt;
  .Where(a =&amp;gt; a.Id == 1)
  .Set(a =&amp;gt; a.Count, 2);

if(condition)
  query = query.Set(a =&amp;gt; a.Name, a =&gt; a.Name + "test");
query.Update();
&lt;/pre&gt;&lt;h4&gt;Updating lots of properties at once&lt;/h4&gt;In a scenario when many properties must be updated at once, the alternative version of update extension syntax might be more convenient to use. The main method is called &lt;b&gt;Update&lt;/b&gt; instead of &lt;b&gt;Set&lt;/b&gt; and it takes a constructor with object initializer as argument:&lt;br /&gt;
&lt;pre&gt;Query.All&amp;lt;Bar&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  &lt;b&gt;.Update(a =&amp;gt; new Bar(null) { Count = 2, Name = a.Name + "test", dozens of other properties... });&lt;/b&gt;
&lt;/pre&gt;Note, while you have to populate the constructor with arguments because compiler requires that, it will never be called, only the object initializer will be processed. So it is safe you set fake arguments to the constructor. In all other ways these 2 kinds of syntax are equal, just choose the one that is convenient for you.&lt;br /&gt;
&lt;h4&gt;Deleting entities&lt;/h4&gt;Delete syntax is pretty straightforward, no new rocket science is here. It is almost the same as &lt;b&gt;Update&lt;/b&gt; syntax, but use &lt;b&gt;Delete&lt;/b&gt; instead.&lt;br /&gt;
&lt;pre&gt;Query.All&amp;lt;Foo&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  &lt;b&gt;.Delete();&lt;/b&gt;
&lt;/pre&gt;is translated to:&lt;br /&gt;
&lt;pre&gt;DELETE [dbo].[Foo]
FROM [dbo].[Foo] AS j0 INNER JOIN (
SELECT
  [a].[Id]
FROM
  [dbo].[Foo] [a]
WHERE
  ([a].[Id] = 1)
) AS j1 ON (j0.[Id] = j1.[Id])
&lt;/pre&gt;&lt;h2&gt;Known limitations&lt;/h2&gt;1. This version supports Microsoft SQL Server only.&lt;br /&gt;
2. When updating a reference field, you can't refer to the entity that is being updated, for instance:&lt;br /&gt;
&lt;pre&gt;Query.All&amp;lt;Foo&amp;gt;()
  .Where(a =&amp;gt; a.Id == 1)
  .Set(a =&amp;gt; a.Bar, &lt;b&gt;a =&amp;gt;&lt;/b&gt; Query.All&amp;lt;Bar&amp;gt;().FirstOrDefault(&lt;b&gt;b =&amp;gt; b.Name == a.Name&lt;/b&gt;))
  .Update();
&lt;/pre&gt;3. Session.SaveChanges() method is executed before any batch server-side operation. This might lead to validation of entities, depending on validation configuration.&lt;br /&gt;
4. Every batch server-side operation cleans Session cache to provide data consistency.&lt;br /&gt;
5. Batch server-side operations don't support compiled LINQ queries.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Credits&lt;/h2&gt;All credits go to Alexander Ovchinnikov. The extension is a must-have, I'm absolutely sure that it will be very popular among DataObjects.Net community.&lt;br /&gt;
&lt;br /&gt;
Thanks, Alexander!&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
The second part is coming soon. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-3350102477391238470?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=qndP07I3bFA:6NeYMMSSncQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=qndP07I3bFA:6NeYMMSSncQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=qndP07I3bFA:6NeYMMSSncQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=qndP07I3bFA:6NeYMMSSncQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=qndP07I3bFA:6NeYMMSSncQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=qndP07I3bFA:6NeYMMSSncQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=qndP07I3bFA:6NeYMMSSncQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=qndP07I3bFA:6NeYMMSSncQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/qndP07I3bFA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/3350102477391238470/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/11/dataobjectsnet-extensions-part-1.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3350102477391238470?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3350102477391238470?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/qndP07I3bFA/dataobjectsnet-extensions-part-1.html" title="DataObjects.Net Extensions, part 1" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-If7pshRHthc/TskEvUIm9II/AAAAAAAAAa8/ORH1pDX6zKo/s72-c/1.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/11/dataobjectsnet-extensions-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IMR3g8cSp7ImA9WhRSFkw.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-3741791884363849318</id><published>2011-11-18T16:12:00.000+06:00</published><updated>2011-11-18T16:19:46.679+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-18T16:19:46.679+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="documentation" /><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><title>Precise control over indexes</title><content type="html">&lt;a href="http://www.bcia.co.uk/images/members/total-control.gif" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="120"src="http://www.bcia.co.uk/images/members/total-control.gif" /&gt;&lt;/a&gt;This is a detailed description of the index-related&amp;nbsp;features from the upcoming release mentioned in &lt;a href="http://blog.dataobjects.net/2011/11/upcoming-major-update.html"&gt;the previous post&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Database indexes were invented to&amp;nbsp;improve the speed of data retrieval operations on a database table. But as always, they have the cost: slower writes and increased storage space. So database architects have to keep the balance between faster data retrieval and slower writes. Ideally, indexes should be applied only on columns that are used in filtering, ordering, etc.&lt;br /&gt;
&lt;h2&gt;1. Control over indexes on reference fields&lt;/h2&gt;Versions of DataObjects.Net prior to the upcoming one were pretty straightforward and applied indexes on every reference property, for example, in this model index would be placed on &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Owner&lt;/span&gt; property automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class Penguin : Entity {

  [Field]
  public Person Owner { get; set; }
}&lt;/pre&gt;&lt;br /&gt;
DataObjects.Net behaved so in assumption that such indexes would boost performance in queries like:&lt;br /&gt;
&lt;pre&gt;var PoppersPenguins = session.Query.All&amp;lt;Penguin&amp;gt;().Where(a =&amp;gt; a.Owner == MrPopper);
&lt;/pre&gt;&lt;br /&gt;
But what if the application doesn't have such queries? And the index that is created and maintained by the database is absolutely useless, moreover, it makes the performance worse? The upcoming version of DataObjects.Net has the answers. Here is what you can do to prevent automatic index creation on a reference field:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class Penguin : Entity {

  [Field(&lt;b&gt;Indexed = false&lt;/b&gt;)]
  public Person Owner { get; set; }
}&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;2. Control over index clustering&lt;/h2&gt;There are 2 main approaches in physical organization of data tables: &lt;a href="http://en.wikipedia.org/wiki/Database_storage_structures"&gt;unordered and ordered&lt;/a&gt;. The first one means that the records are stored in the order they are inserted, the second implies that the records are pre-sorted before storing. Both of them have advantages and disadvantages, depending on structure of primary key, usage scenarios, etc. Some database servers supports both cases, others - only one. Microsoft SQL Server supports both: unordered approach is a "heap table (file)" and ordered one is based on "clustered index" when data rows are physically sorted according to position of primary key in internal index structures (B+ tree).&lt;br /&gt;
&lt;br /&gt;
For Microsoft SQL Server DataObjects.Net always chose "clustered index" as an organization of physical storage because this is quite efficient in most cases with only few exceptions: when your primary key is not integer auto-incremented data type but &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;uniqueidentifier&lt;/span&gt; or &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;char/varchar&lt;/span&gt;, clustered indexes become less efficient on data inserts. Until now there was no way to say that there is no necessity to make primary index clustered, but that has changed: DataObjects.Net provides easy way to control clustering of indexes. Here is how:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;// Penguin table should not be clustered
[HierarchyRoot(&lt;b&gt;Clustered = false&lt;/b&gt;)]
public class Penguin : Entity {

  [Field]
  public Person Owner { get; set; }
}&lt;/pre&gt;&lt;br /&gt;
Note, removing clustering from hierarchy root you remove it for all its descendants.&lt;br /&gt;
&lt;br /&gt;
Additional feature is the ability to define an index that is not primary and then use it for clustering, like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;// Person table should be clustered by Name column
[HierarchyRoot]
&lt;b&gt;[Index("Name", Clustered = true)]&lt;/b&gt;
public class Person : Entity {

  [Field]
  public string Name { get; set; }
}&lt;/pre&gt;&lt;br /&gt;
This can be done for each class separately except the case when &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SingleTable&lt;/span&gt; inheritance scheme is used. Another obvious restriction is that there can be only one clustered index per table.&lt;br /&gt;
&lt;h2&gt;3. Support for partial (filtered) indexes&lt;/h2&gt;A &lt;a href="http://en.wikipedia.org/wiki/Partial_index"&gt;partial index&lt;/a&gt;, also known as filtered index is an index which has some condition applied to it so that it includes a subset of rows in the table. This allows the index to remain small, even though the table may be rather large, and have extreme selectivity.&lt;br /&gt;
&lt;br /&gt;
Our goal was not only to add the support, but to make it easy to use and prevent users from the necessity to write database server-dependent expressions in index definitions. Therefore, we decided to implement the following technique that gives us compile-time validation, type-safety and the power of standard .NET expressions:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[HierarchyRoot
[&lt;b&gt;Index("Owner", Filter = "OwnerIndex")&lt;/b&gt;]
public class Penguin : Entity {

    &lt;b&gt;public static Expression&amp;lt;Func&amp;lt;Penguin, bool&amp;gt;&amp;gt; OwnerIndex()
    {
      return p =&amp;gt; p.Owner != null;
    }&lt;/b&gt;

    [Field]
    public Person Owner { get; set; } 
}
&lt;/pre&gt;&lt;br /&gt;
Note that depending on inheritance scheme applied, partial indexes can or can't contain expressions with columns defined in ancestors/descendants.&lt;br /&gt;
&lt;br /&gt;
In case you want to move filter expression to a separate class, you should use the following construct:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[HierarchyRoot]
[Index("Owner", Filter = "PenguinOwnerIndex", &lt;b&gt;FilterType = typeof(FilterExpressions)&lt;/b&gt;)]
public class Penguin : Entity {

    [Field]
    public Person Owner { get; set; } 
}

public static class FilterExpressions {

    public static Expression&amp;lt;Func&amp;lt;Penguin, bool&amp;gt;&amp;gt; PenguinOwnerIndex()
    {
      return p =&amp;gt; p.Owner != null;
    }
}
&lt;/pre&gt;&lt;br /&gt;
Partial indexes are supported in Microsoft SQL Server and PostgreSQL providers.&lt;br /&gt;
&lt;br /&gt;
In the next post I'll describe other features of the upcoming release, stay tuned. In the meantime, we are preparing the new builds, installers and stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-3741791884363849318?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=mE6Bh4FrYY4:fqa2s7Vj7ag:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=mE6Bh4FrYY4:fqa2s7Vj7ag:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=mE6Bh4FrYY4:fqa2s7Vj7ag:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=mE6Bh4FrYY4:fqa2s7Vj7ag:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=mE6Bh4FrYY4:fqa2s7Vj7ag:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=mE6Bh4FrYY4:fqa2s7Vj7ag:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=mE6Bh4FrYY4:fqa2s7Vj7ag:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=mE6Bh4FrYY4:fqa2s7Vj7ag:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/mE6Bh4FrYY4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/3741791884363849318/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/11/precise-control-over-indexes.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3741791884363849318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3741791884363849318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/mE6Bh4FrYY4/precise-control-over-indexes.html" title="Precise control over indexes" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/11/precise-control-over-indexes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AMQ34-eip7ImA9WhRQFkQ.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-1453465319827862757</id><published>2011-11-14T20:08:00.000+06:00</published><updated>2011-12-12T20:23:02.052+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-12T20:23:02.052+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>Upcoming major update</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.usernetsite.com/humor/how-evolution-happens/nuclear-evolution.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="160" src="http://www.usernetsite.com/humor/how-evolution-happens/nuclear-evolution.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Hello everybody,&lt;br /&gt;
&lt;br /&gt;
Despite the fact that there was no news in this blog from DataObjects.Net team for a couple of months, this doesn't mean that we were having rest or watching endless TV-series. We've been&amp;nbsp;fixing bugs and&amp;nbsp;inventing some really cool features for our customers.&amp;nbsp;Let's take a closer look at the details.&lt;br /&gt;
&lt;br /&gt;
First of all, bugs fixed:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;JoinedTuple WCF deserialization is fixed. This might appear only in cases when Entity has more than 63 persistent properties&lt;/li&gt;
&lt;li&gt;Key.Equals &amp;amp; TypeReference.Accuracy were fixed&lt;/li&gt;
&lt;li&gt;Type descendants &amp;amp; interface implementors discovery in IndexBuilder is fixed&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4630/project-with-spaces-in-name"&gt;Project template generated wrong Assembly name for projects with spaces in project name.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4632/nullreferenceexception-during-domain-build-with-performperformsafely-mode"&gt;HintGenerator throwed NullReferenceException on GenerateCleanupByForeignKeyHints method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4628/missing-foreign-keys-for-complex-type-hierarchies"&gt;Foreign keys were missed in some complex scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/3976/wrong-linq-translation-of-in-clause-with-empty-list"&gt;Wrong linq translation of IN clause with empty list is fixed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4617/wrong-linq-translation-of-nullable-boolean-fields"&gt;Wrong linq translation of Nullable boolean fields is fixed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;It wasn't possible to delete and create entity with same key (within active inconsistency region).&lt;/li&gt;
&lt;li&gt;Primary key alteration no more leads to table recreation&lt;/li&gt;
&lt;li&gt;Usage of Prefetch no more leads to possible memory leaks&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4624/some-bug-with-type-cast-if-use-contain"&gt;Bug with translation of Contains method&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Updates to the existing functionality:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;SchemaComparisonResult is included into SchemaSynchonizationException for simplificationf of upgrade procedure writing and debugging&lt;/li&gt;
&lt;li&gt;StorageException now contains additional information about database, table, column, value and violated constraint&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dataobjects.uservoice.com/forums/76041-features-and-ideas/suggestions/2107909-guid-typeid?ref=title"&gt;Guid values can be used as TypeDiscriminator values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4679/wrong-ddldml-order-in-upgrade-procedure"&gt;The order of upgrade sequence is changed so unique constraints and foreign keys are removed at the very beginning of the upgrade procedure and are applied only after custom upgrade handlers finish their work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;The most interesting part, features:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dataobjects.uservoice.com/forums/76041-features-and-ideas/suggestions/1398305-sqlgeography-sqlgeometry-data-types?ref=title"&gt;Basic support for SqlGeometry &amp;amp; SqlGeography types, spatial index support in SQL Server driver&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dataobjects.uservoice.com/forums/76041-features-and-ideas/suggestions/2107901-foreign-key-without-index?ref=title"&gt;Precise control over reference properties indexing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Partial (filtered) indexes based on lambda syntax&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dataobjects.uservoice.com/forums/76041-features-and-ideas/suggestions/1477119-clustered-index-not-based-on-primary-key?ref=title"&gt;Сontrol over primary and regular index clustering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating and registering LINQ extensions made more user-friendly&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4506/allow-additional-attributes-in-derived-types"&gt;Attributes overriding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Simply put, the features are so dramatic that we are releasing the stuff as a major version update. DataObjects.Net 4.3.7 branch will become 4.3.8 and 4.4.0 will be known as 4.4.1 (one of our lead developers call this update as DataObjects.Net R2 and I understand him pretty much).&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;While the above mentioned changes are being thoroughly tested under various environments and being prepared for the release, we'll describe the features listed above in a dedicated series of posts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Thank you! Stay tuned.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-1453465319827862757?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=LERsJj9rJhc:f153c9F0LlE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=LERsJj9rJhc:f153c9F0LlE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=LERsJj9rJhc:f153c9F0LlE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=LERsJj9rJhc:f153c9F0LlE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=LERsJj9rJhc:f153c9F0LlE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=LERsJj9rJhc:f153c9F0LlE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=LERsJj9rJhc:f153c9F0LlE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=LERsJj9rJhc:f153c9F0LlE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/LERsJj9rJhc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/1453465319827862757/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/11/upcoming-major-update.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/1453465319827862757?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/1453465319827862757?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/LERsJj9rJhc/upcoming-major-update.html" title="Upcoming major update" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>7</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/11/upcoming-major-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEANQXk7cSp7ImA9WhdQFUo.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-5691743392620839461</id><published>2011-08-17T15:19:00.002+06:00</published><updated>2011-08-17T15:19:50.709+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-17T15:19:50.709+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="licensing" /><title>Update of licensing component in DataObjects.Net 4.5 Beta 4</title><content type="html">As you might remember, a year ago DataObjects.Net changed its license and become proprietary. In order to protect the product from being stolen we decided to use &lt;a href="http://www.eziriz.com/dotnet_reactor.htm"&gt;Eziriz .NET Reactor&lt;/a&gt; library, which fitted rather well to DataObjects.Net distribution model (trial mode → purchase → simple activation via internet). And it seemed smooth and efficient until one nuisance was discovered. &lt;br /&gt;
&lt;br /&gt;
.NET Reactor operates with so-called Hardware Id (HWID) which can be calculated from identifiers of four hardware components: processor, motherboard, network card &amp;amp; hard disk drive. We had decided to choose the first three and unfortunately that was rather short-sighted decision because (it was found out later), .NET Reactor takes into account all network cards, even virtual, so when a DataObjects.Net customer plugged-in his mobile phone or opened a VPN connection, a new network interface appeared, HWID changed and therefore, valid DataObjects.Net license suddenly became invalid.&lt;br /&gt;
&lt;br /&gt;
To sort out the problem we are changing the implementation of licensing scheme in DataObjects.Net 4.5 - network cards identifiers will be taken into account no more. As a result of the algorithm alteration, HWID will change and this will require 2 simple actions: revoking previous HWID license and activating the new one. We understand that this might be a noticeable inconvenience, that's why the measure is applied only to the upcoming version while DataObjects.Net 4.4 stays untouched.&lt;br /&gt;
&lt;br /&gt;
For users of DataObjects.Net 4.4 who regularly face with HWID changes, I recommend the following path:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;make a backup of your %DataObjects.Net directory%&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;download DataObjects.Net 4.5 Beta 4&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;take Xtensive.LicenseManager.dll &amp;amp; Xtensive.Aspects.Weaver.dll from there and replace the corresponding files in %DataObjects.Net directory%\Bin\Latest, %DataObjects.Net directory%\Bin\Debug &amp;amp; %DataObjects.Net directory%\Bin\Release folders.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
Here is how the process of hardware license update looks like:&lt;br /&gt;
&amp;nbsp;1. When using the licensing component from DataObjects.Net 4.5 you might see the following screen:  &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-9S9xziAb-_Q/Tkpqc5N8nFI/AAAAAAAAAZE/_z3jK0IRWzU/s1600/LicenseManager.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="366" src="http://4.bp.blogspot.com/-9S9xziAb-_Q/Tkpqc5N8nFI/AAAAAAAAAZE/_z3jK0IRWzU/s400/LicenseManager.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Note that License Manager will show you the new HWID, which is calculated without data about network cards. This HWID is not yet activated.  If you have Ultimate license, go directly to the step 4.&lt;br /&gt;
&lt;br /&gt;
2. Open Explorer and point it to &lt;b&gt;C:\ProgramData\DataObjects.Net&lt;/b&gt; folder. Usually this folder stores primary (or company) license (DataObjects.Net.license file) and the hardware one (XXXX-XXXX-XXXX-XXXX-XXXX.hwl file).  &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-WY_2jOcGAzE/TkpsISjnWVI/AAAAAAAAAZM/IGGksxtguzQ/s1600/Licenses.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="448" src="http://1.bp.blogspot.com/-WY_2jOcGAzE/TkpsISjnWVI/AAAAAAAAAZM/IGGksxtguzQ/s640/Licenses.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Here "3CA3-0442-7A86-4820-423A.hwl" is the file with my previous hardware license. So open your browser and go to &lt;a href="http://x-tensive.com/Profile/Subscriptions.aspx"&gt;My Subscriptions&lt;/a&gt; to revoke the old hardware license.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;3. Revoke the outdated hardware license. As you have upgraded to DataObjects.Net 4.5, you wouldn't need the hardware license from the previous version.  &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-WRMWRUejV6Y/TkpxtAm6CjI/AAAAAAAAAZY/jaRKC7BQGl4/s1600/LicensesWebsite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="515" src="http://1.bp.blogspot.com/-WRMWRUejV6Y/TkpxtAm6CjI/AAAAAAAAAZY/jaRKC7BQGl4/s640/LicensesWebsite.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
4. In License Manager click "Install License...".   &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-hiGHgqddihg/Tkp76-OfFoI/AAAAAAAAAZg/fph2-o9JFqQ/s1600/LicenseManager2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="http://3.bp.blogspot.com/-hiGHgqddihg/Tkp76-OfFoI/AAAAAAAAAZg/fph2-o9JFqQ/s400/LicenseManager2.png" width="399" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Note that primary (company) license is still valid and doesn't require any changes. Choose "Hardware key activation: Internet" and voilà, activation is successful.  &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-XHSS8lzbG-o/Tkp8OK8cMCI/AAAAAAAAAZk/8Oz3vMnEf5s/s1600/LicenseManager3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://2.bp.blogspot.com/-XHSS8lzbG-o/Tkp8OK8cMCI/AAAAAAAAAZk/8Oz3vMnEf5s/s400/LicenseManager3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
DataObjects.Net 4.5 Beta 4 is available for download on the &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-5"&gt;website&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-5691743392620839461?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nIDcDL6HDeg:stkqFYR0p4I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nIDcDL6HDeg:stkqFYR0p4I:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=nIDcDL6HDeg:stkqFYR0p4I:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nIDcDL6HDeg:stkqFYR0p4I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=nIDcDL6HDeg:stkqFYR0p4I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nIDcDL6HDeg:stkqFYR0p4I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nIDcDL6HDeg:stkqFYR0p4I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=nIDcDL6HDeg:stkqFYR0p4I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/nIDcDL6HDeg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/5691743392620839461/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/08/update-of-licensing-component-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/5691743392620839461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/5691743392620839461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/nIDcDL6HDeg/update-of-licensing-component-in.html" title="Update of licensing component in DataObjects.Net 4.5 Beta 4" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-9S9xziAb-_Q/Tkpqc5N8nFI/AAAAAAAAAZE/_z3jK0IRWzU/s72-c/LicenseManager.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/08/update-of-licensing-component-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMMRXw7cCp7ImA9WhdREU8.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-3881440405438357722</id><published>2011-07-31T21:01:00.000+06:00</published><updated>2011-07-31T21:01:24.208+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-31T21:01:24.208+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net 4.3 &amp; 4.4 are updated to the latest revision</title><content type="html">Today both stable versions of DataObjects.Net are updated to the revision 7685. This build includes the extension of Upgrade mechanism that was described in the &lt;a href="http://blog.dataobjects.net/2011/07/more-flexibility-to-database-schema.html"&gt;previous post&lt;/a&gt; as well as the following changes:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4559/default-field-set-to-enum-works-for-memory-database-but-not-postgres"&gt;FieldAttribute.DefaultValue now works with all supported primitive types including Enums and Guids&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4566/error-in-fields-name"&gt;Domain model builder detects columns with names that differ only in letter case&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4569/practical-overloads-for-hints-constructors"&gt;Overloads for upgrade hints constructors are added&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.x-tensive.com/question/4580/bug-queryableextensionsremove-and-server-profile"&gt;SessionExtensions.Remove for SessionOptions.ServerProfile is fixed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeInfoCollection.FindInterfaces, FindImplementors, FindDescendants methods are fixed&lt;/li&gt;
&lt;li&gt;Explicit interface implementation analysis in ModelInspector is updated&lt;/li&gt;
&lt;li&gt;Persistent field discovery through indexer is fixed in LINQ&lt;br /&gt;
&lt;pre&gt;// MyEntity.MyField can be non-public now
session.Query.All&amp;lt;MyEntity&amp;gt;.Where(e =&gt; e["MyField"] == value);
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Persistent.AdjustValue methods are added. This is useful in cases when you need an extension point to do some actions with field value after it is read from storage but not yet returned to the caller and vice versa.&lt;br /&gt;
&lt;pre&gt;public class MyEntity : Entity {

  // This is called on GetFieldValue
  protected override object AdjustFieldValue(FieldInfo field, object value)
  {
    if (field.Name != "MyField")
      return value;

    // Do some actions with value
    return value;
  }

  // This is called on SetFieldValue
  protected override object AdjustFieldValue(FieldInfo field, object oldValue, object newValue)
  {
    if (field.Name != "MyField")
      return value;

    // Do some actions with value before it is stored
    return value;
  }
&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;The updated installers as well as binaries can be downloaded from the official website: &lt;a href="http://dataobjects.net/downloads/default.aspx"&gt;dataobjects.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-3881440405438357722?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=C02kZ0khrLA:LH6u1xbcSho:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=C02kZ0khrLA:LH6u1xbcSho:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=C02kZ0khrLA:LH6u1xbcSho:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=C02kZ0khrLA:LH6u1xbcSho:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=C02kZ0khrLA:LH6u1xbcSho:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=C02kZ0khrLA:LH6u1xbcSho:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=C02kZ0khrLA:LH6u1xbcSho:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=C02kZ0khrLA:LH6u1xbcSho:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/C02kZ0khrLA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/3881440405438357722/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/07/dataobjectsnet-43-44-are-updated-to.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3881440405438357722?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3881440405438357722?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/C02kZ0khrLA/dataobjectsnet-43-44-are-updated-to.html" title="DataObjects.Net 4.3 &amp; 4.4 are updated to the latest revision" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/07/dataobjectsnet-43-44-are-updated-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YHR3k6eip7ImA9WhdTGE8.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-6498553955800212279</id><published>2011-07-16T21:12:00.000+06:00</published><updated>2011-07-16T21:12:16.712+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-16T21:12:16.712+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>More flexibility to database schema upgrade</title><content type="html">In this post I'm going to describe one of the most advanced and appreciated features of DataObjects.Net — automatic database schema upgrade.&lt;br /&gt;
&lt;br /&gt;
You know, automatic database schema generation for Code-First &amp;amp; Model-First ORMs is a vital requirement, however while the task is not trivial by itself, it is not so difficult in comparison with continuous domain model &amp;amp; database schema synchronization. One can imagine all kind of operations on domain model: creating, renaming, moving, splitting, merging, deleting types, fields, associations, field options, index options, validation constraints, etc. All these types of changes must be propagated by ORM to database schema more or less transparently and without any possible loss of data.&lt;br /&gt;
&lt;br /&gt;
In DataObjects.Net this goal is achieved with the help of mature upgrading framework that had been polished for years in version 3.x branch (starting from 2003 year) and then was migrated to version 4.x one with numerous core updates and extensions.&lt;br /&gt;
&lt;br /&gt;
This could be surprising, but the core component of the upgrade framework is not translation of upgrade actions to SQL or making changes to a database schema, but the effective comparison of 2 abstract models. I'm talking about &lt;b&gt;Xtensive.Modelling&lt;/b&gt; that was invented for describing and comparing models of any thing. In case of DataObjects.Net it is being used to compare 2 models of a storage.&lt;br /&gt;
&lt;br /&gt;
Here is how the whole process is constructed. We build domain model and convert it to a unified model of storage. In parallel, we extracting metadata about database schema and converting it to the model of existing storage. After that we compare these two and additionally pass to the comparison procedure a set of upgrade hints that are provided by a user. As a result, we get a difference between 2 models and a sequence of upgrade actions that must be executed in order to convert the existing storage to the new one.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JtxNcETMn94/TiGTy-6Km9I/AAAAAAAAAY0/qqAfL4HpFLk/s1600/Upgrade%2BSequence.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="632" src="http://1.bp.blogspot.com/-JtxNcETMn94/TiGTy-6Km9I/AAAAAAAAAY0/qqAfL4HpFLk/s640/Upgrade%2BSequence.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Upgrade actions are taken place only when a domain is being built in &lt;b&gt;DomainUpgradeMode.Perform&lt;/b&gt; or &lt;b&gt;PerformSafely&lt;/b&gt;. These two have one principal distinction: while &lt;b&gt;Perform&lt;/b&gt; silently alters whatever is required even with data loss, &lt;b&gt;PerformSafely&lt;/b&gt; guarantees that nothing will be removed unless is explicitly declared by a user by using special upgrade hints and attributes. The hints are nonetheless important and useful in both scenarios as they provide additional information for the comparison routine on what changes are made to domain model.&lt;br /&gt;
&lt;br /&gt;
What are these hints?&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;RenameTypeHint&lt;/b&gt; — for renaming a persistent type&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RenameFieldHint&lt;/b&gt; — for renaming a persisting field&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RemoveTypeHint&lt;/b&gt; — for removing a persistent type&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RemoveFieldHint&lt;/b&gt; — for removing a persistent field&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ChangeFieldTypeHint&lt;/b&gt; — for a situation when type of a persistent field is changed&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MoveFieldHint&lt;/b&gt; — for moving a persistent field from one type to another&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CopyFieldHint&lt;/b&gt; — for copying a persistent field from one type to another&lt;/li&gt;
&lt;/ul&gt;The hints mechanism is intended to be used in custom implementation of &lt;b&gt;UpgradeHandler&lt;/b&gt; class. This can be included into an assembly that is going to be upgraded from version "1.0.0.0" to another one and can look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class MyUpgradeHandler : UpgradeHandler
{
  public override bool CanUpgradeFrom(string oldVersion)
  {
    return oldVersion == "1.0.0.0";
  }

  protected override void AddUpgradeHints()
  {
    var hintSet = UpgradeContext.Hints;
 
    hintSet.Add(
      new RenameTypeHint("MyProduct.Model.Customer", typeof (Person)));
    hintSet.Add(
      new RenameFieldHint(typeof (Person), "Name", "FullName"));
  }
}
&lt;/pre&gt;More about the hints and usage examples in our &lt;a href="http://help.dataobjects.net/##DataObjects.Net%20v4.4/html/34aeb6cd-61e8-4db2-88f8-1eff2031f103.htm"&gt;manual&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The upgrade hints infrastructure serves well for the overwhelming majority of scenarios but there are relatively rare situations where a change in domain model can't be described with these hints. We were gathering information and analyzing such cases and afterall, decided to extend the interface of &lt;b&gt;UpgradeHandler&lt;/b&gt; class to provide an additional point where the upgrade routine can be corrected by user. On the picture above there is the last point, where upgrade actions are generated based on the storage models comparison result. Until now, these actions were automatically applied to a database schema and there was no way to control this process.&lt;br /&gt;
&lt;br /&gt;
We are adding a method to &lt;b&gt;UpgradeHandler&lt;/b&gt; class that exposes a sequence of upgrade actions before thay are applied to database scheme:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class UpgradeHandler : IUpgradeHandler

    // ...

    public virtual void OnBeforeExecuteActions(UpgradeActionSequence actions)
    {
      // In overridden method actions can be added, edited, removed, etc.
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;UpgradeActionSequence&lt;/b&gt; contains all actions that will be played against a database scheme, split in groups. An action is a regular SQL command. In this method any action can be removed, edited, moved from one group to another, new actions can be added to the sequence and so on.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-elGc2WKfsRw/TiGifhRkFHI/AAAAAAAAAY8/TSRU4GaJ9wE/s1600/Upgrade%2BActions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="251" src="http://2.bp.blogspot.com/-elGc2WKfsRw/TiGifhRkFHI/AAAAAAAAAY8/TSRU4GaJ9wE/s640/Upgrade%2BActions.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The actions are executed in the following order:&lt;br /&gt;
&lt;br /&gt;
01. NonTransactionalEpilogueCommands&lt;br /&gt;
02. &lt;b&gt;Open transaction&lt;/b&gt;&lt;br /&gt;
03. CleanupDataCommands&lt;br /&gt;
04. PreUpgradeCommands&lt;br /&gt;
05. UpgradeCommands&lt;br /&gt;
06. CopyDataCommands&lt;br /&gt;
07. PostCopyDataCommands&lt;br /&gt;
08. CleanupCommands&lt;br /&gt;
09. &lt;b&gt;Commit transaction&lt;/b&gt;&lt;br /&gt;
10. NonTransactionalEpilogueCommands&lt;br /&gt;
&lt;br /&gt;
Note the transaction boundaries: all commands except those that don't support transactional execution are run in one transaction so on any error the scheme will stay valid and integral.&lt;br /&gt;
&lt;br /&gt;
The new bits are being tested now and will be available soon as nightly builds. After the thorough testing, the updated DataObjects.Net will be available as usual on our website.&lt;br /&gt;
&lt;br /&gt;
Thanks for your attention.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-6498553955800212279?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=uJUWXdQx02s:dWi5zNtAiq4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=uJUWXdQx02s:dWi5zNtAiq4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=uJUWXdQx02s:dWi5zNtAiq4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=uJUWXdQx02s:dWi5zNtAiq4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=uJUWXdQx02s:dWi5zNtAiq4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=uJUWXdQx02s:dWi5zNtAiq4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=uJUWXdQx02s:dWi5zNtAiq4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=uJUWXdQx02s:dWi5zNtAiq4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/uJUWXdQx02s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/6498553955800212279/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/07/more-flexibility-to-database-schema.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6498553955800212279?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6498553955800212279?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/uJUWXdQx02s/more-flexibility-to-database-schema.html" title="More flexibility to database schema upgrade" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-JtxNcETMn94/TiGTy-6Km9I/AAAAAAAAAY0/qqAfL4HpFLk/s72-c/Upgrade%2BSequence.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/07/more-flexibility-to-database-schema.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAEQ34-eSp7ImA9WhZaEEQ.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-928403377476604529</id><published>2011-06-26T19:07:00.001+06:00</published><updated>2011-06-26T19:08:22.051+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-26T19:08:22.051+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>DataObjects.Net 4.5 Beta 3</title><content type="html">Today DataObjects.Net team is happy to publish the third beta of 4.5 version. This release mostly contains changes in the security system as well as bug fixes merged from the stable branch.&lt;br /&gt;
&lt;br /&gt;
After the &lt;a href="http://blog.dataobjects.net/2011/06/dataobjectsnet-45-beta-2.html"&gt;Beta 2 was published&lt;/a&gt;, we received great feedback concerning the security system and we are very glad for that. Thanks to all of you who dropped us a line concerning this stuff.&lt;br /&gt;
&lt;h2&gt;Changes from Beta 2&lt;/h2&gt;First and the most important one is that roles are made persistent. There were numerous requests for this feature, moreover the idea of Terje Myklebust that he formulated as a templates for roles fits to this pattern very well — a persistent class serves as a template, so you can have as many parameterized instances of it as you need. Here is the updated Role hierarchy:&lt;br /&gt;
&lt;pre&gt;public interface IRole : IEntity
  {
    [Field]
    string Name { get; }

    [Field]
    [Association(PairTo = "Roles", OnOwnerRemove = OnRemoveAction.Clear, OnTargetRemove = OnRemoveAction.Clear)]
    EntitySet&lt;iprincipal&gt; Principals { get; }

    IList&lt;permission&gt; Permissions { get; }
  }

  [Index("Name", Unique = true)]
  public abstract class Role : Entity, IRole
  {
    [NotNullConstraint(Mode = ConstrainMode.OnSetValue)]
    [Field(Length = 128)]
    public string Name { get; protected set; }

    [Field]
    public EntitySet&lt;iprincipal&gt; Principals { get; private set; }

    public IList&lt;permission&gt; Permissions { get; }

    protected void RegisterPermission(Permission permission);

    protected abstract void RegisterPermissions();

    protected Role(Session session)
      : base(session)
    {
      Name = GetType().Name;
    }
  }
&lt;/pre&gt;Xtensive.Practices.Security contains the abstract class Role that implements all the required infrastructure for permission registration and handling. Each instance of Role must contain unique name. By default, Role class sets name property to name of the concrete type. In case you want more than one instances of a role of the same type, you must give them unique names. Role and Principal now are connected via paired entitysets. So a principal knows all its roles and vice versa.&lt;br /&gt;
&lt;br /&gt;
Note that the Role class doesn't define hierarchy root and key fields. You must do this manually as you do in case of Principal, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[HierarchyRoot(InheritanceSchema = InheritanceSchema.SingleTable)]
  public abstract class EmployeeRole : Role
  {
    [Field, Key]
    public int Id { get; set; }

    protected override void RegisterPermissions()
    {
      // This is base role for every employee

      // All employees can see products
      RegisterPermission(new Permission&lt;product&gt;());
      // All employees can see employees
      RegisterPermission(new Permission&lt;employee&gt;());
    }

    protected EmployeeRole(Session session)
      : base(session)
    {
    }
  }
&lt;/pre&gt;All other roles inherit EmployeeRole. Note that in case of roles the SingleTable inheritance scheme is the best option as all role types are similar and can be effectively placed inside a single table.&lt;br /&gt;
&lt;h4&gt;Other changes:&lt;/h4&gt;Session.ValidatePrincipal method is renamed to Session.Authenticate.&lt;br /&gt;
IPrincipalValidationService is renamed to IAuthenticationService&lt;br /&gt;
GenericPrincipalValidationService is renamed to GenericAuthenticationService&lt;br /&gt;
GenericRoleProvider, PrincipalRole, PrincipalRoleSet, RoleSet are discarded as useless.&lt;br /&gt;
&lt;h2&gt;Roles as templates&lt;/h2&gt;There was a fruitful discussion after the previous post and the idea of role templates was suggested. Here is how it can be implemented in the Beta 3. I'll take the same scenario with branches and office manager roles.&lt;br /&gt;
&lt;br /&gt;
Fisrt, let's define branches&lt;br /&gt;
&lt;pre&gt;[HierarchyRoot]
  public class Branch : Entity
  {
    [Field, Key]
    public int Id { get; private set; }

    [Field]
    public string Name { get; set; }

    public Branch(Session session)
      : base(session)
    {}
  }
&lt;/pre&gt;And then, define a branch office manager role&lt;br /&gt;
&lt;pre&gt;public class BranchOfficeManagerRole : EmployeeRole
  {
    [Field]
    &lt;b&gt;public Branch Branch { get; set; }&lt;/b&gt;

    private IQueryable&lt;customer&gt; GetCustomers(ImpersonationContext context, QueryEndpoint query)
    {
      &lt;b&gt;return query.All&lt;customer&gt;()
        .Where(c =&gt; c.Branch == Branch);&lt;/b&gt;
    }

    protected override void RegisterPermissions()
    {
      RegisterPermission(new Permission&lt;customer&gt;(true, GetCustomers));
    }

    public BranchOfficeManagerRole(Session session, Branch branch)
      : base(session)
    {
      &lt;b&gt;Branch = branch;
      Name = branch.Name + "OfficeManager";&lt;/b&gt;
    }
  }
&lt;/pre&gt;&lt;br /&gt;
See, the role class is not tied to a concrete branch office instance, it only declares a connection between a role type and a branch type instead. The concrete Branch instance is passed in the constructor. Also note how Name property is formed in the constructor to avoid non-uniqueness.&lt;br /&gt;
&lt;br /&gt;
Having these classes declared we can easily use them in creating the appropriate role instances as many as we need. Moreover, we can create branches and branch-dependent roles in runtime.&lt;br /&gt;
&lt;pre&gt;// Branches
var southBranch = new Branch(session) { Name = "South"};
var northBranch = new Branch(session) { Name = "North"};

// Roles
var southBranchOfficeManagerRole =  new BranchOfficeManagerRole(session, southBranch);
var northBranchOfficeManagerRole =  new BranchOfficeManagerRole(session, northBranch);

// Employees
var user1 = new Employee(session);
user1.Roles.Add(southBranchOfficeManagerRole);

var user2 = new Employee(session);
user2.Roles.Add(northBranchOfficeManagerRole);

// By adding both roles to an employee we can give him a superset of permissions
var user3 = new Employee(session);
user3.Roles.Add(southBranchOfficeManagerRole);
user3.Roles.Add(northBranchOfficeManagerRole);
&lt;/pre&gt;&lt;h2&gt;Download&lt;/h2&gt;DataObjects.Net 4.5 Beta 3 can be downloaded from the &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-5"&gt;website&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Dear DataObjects.Net users and contributors. The Beta 3 is very close to the Release Candidate. But before the main branch is frozen, I want to clarify&lt;br /&gt;
a question: should permissions be persistent or not? Is it vital? If yes, how filter expressions should be stored?&lt;br /&gt;
&lt;br /&gt;
If the question is given a sensible answer, we'll continue implementing persistent permissions and make Beta 4; otherwise we will proceed to RC 1.&lt;br /&gt;
&lt;br /&gt;
Thank you.&lt;br /&gt;
&lt;br /&gt;
P.P.S.&lt;br /&gt;
Dear Malisa Ncube,&lt;br /&gt;
It seems that after these alterations you'll have to update the &lt;a href="http://geekswithblogs.net/malisancube/archive/2011/06/14/dataobjects.net-beta2-salespoint-sample-in-mysql.aspx"&gt;SalesPoint database creation script for MySQL&lt;/a&gt;. Sorry for that, hope this won't tale too much time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-928403377476604529?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=jq_1JW66BuQ:UmmldoS9o-U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=jq_1JW66BuQ:UmmldoS9o-U:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=jq_1JW66BuQ:UmmldoS9o-U:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=jq_1JW66BuQ:UmmldoS9o-U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=jq_1JW66BuQ:UmmldoS9o-U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=jq_1JW66BuQ:UmmldoS9o-U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=jq_1JW66BuQ:UmmldoS9o-U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=jq_1JW66BuQ:UmmldoS9o-U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/jq_1JW66BuQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/928403377476604529/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/dataobjectsnet-45-beta-3.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/928403377476604529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/928403377476604529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/jq_1JW66BuQ/dataobjectsnet-45-beta-3.html" title="DataObjects.Net 4.5 Beta 3" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/dataobjectsnet-45-beta-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4NSHc-eSp7ImA9WhZbF0g.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-2146462047549248033</id><published>2011-06-22T21:02:00.001+06:00</published><updated>2011-06-22T21:03:19.951+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-22T21:03:19.951+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><title>DataObjects.Net on Twitter</title><content type="html">Hello everybody, &lt;br /&gt;
&lt;br /&gt;
Finally DataObjects.Net reached Twitter. =)&lt;br /&gt;
Follow us for the latest news and updates.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://twitter.com/DataObjectsNet" class="twitter-follow-button" data-show-count="false"&gt;Follow @DataObjectsNet&lt;/a&gt;&lt;br /&gt;
&lt;script src="http://platform.twitter.com/widgets.js" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-2146462047549248033?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=Xo9ARQWWudo:BESERofABKA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=Xo9ARQWWudo:BESERofABKA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=Xo9ARQWWudo:BESERofABKA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=Xo9ARQWWudo:BESERofABKA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=Xo9ARQWWudo:BESERofABKA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=Xo9ARQWWudo:BESERofABKA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=Xo9ARQWWudo:BESERofABKA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=Xo9ARQWWudo:BESERofABKA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/Xo9ARQWWudo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/2146462047549248033/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/dataobjectsnet-on-twitter.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/2146462047549248033?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/2146462047549248033?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/Xo9ARQWWudo/dataobjectsnet-on-twitter.html" title="DataObjects.Net on Twitter" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/dataobjectsnet-on-twitter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4DSXcyeSp7ImA9WhZbEUk.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-3427660512020184453</id><published>2011-06-15T20:09:00.000+06:00</published><updated>2011-06-15T20:09:38.991+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-15T20:09:38.991+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Samples" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><title>SalesPoint sample database for MySQL</title><content type="html">This is an addition to the previous post, for those who prefer using MySQL instead of Microsoft SQL Server. Malisa Ncube made a conversion of salespoint.sql file  from DataObjects.Net 4.5 Beta 2 package to MySQL syntax and very generously &lt;a href="http://geekswithblogs.net/malisancube/archive/2011/06/14/dataobjects.net-beta2-salespoint-sample-in-mysql.aspx"&gt;published in his blog&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
You will also find there some moving impressions about the SalesPoint sample running on MySQL because he is the official 'father' of MySQL driver for DataObjects.Net.&lt;br /&gt;
&lt;br /&gt;
Thanks, Malisa!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-3427660512020184453?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=AFBj_-XdaVE:MgNHcaEAs5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=AFBj_-XdaVE:MgNHcaEAs5w:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=AFBj_-XdaVE:MgNHcaEAs5w:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=AFBj_-XdaVE:MgNHcaEAs5w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=AFBj_-XdaVE:MgNHcaEAs5w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=AFBj_-XdaVE:MgNHcaEAs5w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=AFBj_-XdaVE:MgNHcaEAs5w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=AFBj_-XdaVE:MgNHcaEAs5w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/AFBj_-XdaVE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/3427660512020184453/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/salespoint-sample-database-for-mysql.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3427660512020184453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3427660512020184453?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/AFBj_-XdaVE/salespoint-sample-database-for-mysql.html" title="SalesPoint sample database for MySQL" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/salespoint-sample-database-for-mysql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MASXk6eyp7ImA9WhZUGUo.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-6210057666194694546</id><published>2011-06-13T21:37:00.001+06:00</published><updated>2011-06-13T21:37:28.713+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-13T21:37:28.713+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>DataObjects.Net 4.5 Beta 2</title><content type="html">Today the DataObjects.Net Team is releasing the second beta of the upcoming 4.5 version of DataObjects.Net. The beta is mostly dedicated to the security system.&lt;br /&gt;
&lt;br /&gt;
All security-related classes are located in a separate assembly called Xtensive.Practices.Security. Let's explore what types to be aware of the assembly includes:&lt;br /&gt;
&lt;ul&gt;&lt;a href="http://4.bp.blogspot.com/-XkIh8Snz1Yk/TfYeLUVSqGI/AAAAAAAAAXM/jV9w4QgyB2o/s1600/SalesPointLogo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="182" src="http://4.bp.blogspot.com/-XkIh8Snz1Yk/TfYeLUVSqGI/AAAAAAAAAXM/jV9w4QgyB2o/s320/SalesPointLogo.png" width="320" /&gt;&lt;/a&gt;
&lt;li&gt;IPrincipal, Principal &amp;amp; GenericPrincipal&lt;/li&gt;
&lt;li&gt;Role &amp;amp; RoleSet&lt;/li&gt;
&lt;li&gt;Permission &amp;amp; PermissionSet&lt;/li&gt;
&lt;li&gt;IHashingService with several implementations&lt;/li&gt;
&lt;li&gt;IPrincipalValidationService with a generic implementation&lt;/li&gt;
&lt;li&gt;ImpersonationContext&lt;/li&gt;
&lt;li&gt;some Session extension methods&lt;/li&gt;
&lt;/ul&gt;Most of them have been already discussed in the previous posts on the topic. However, let's recall the main principals &amp;amp; usage scenarios on a security sample called SalesPoint.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: 25px; font-weight: bold;"&gt;Adding the security system to your project&lt;/span&gt;&lt;br /&gt;
1. Add reference to Xtensive.Practices.Security assembly&lt;br /&gt;
&lt;br /&gt;
2. Register types from Xtensive.Practices.Security in your domain.&lt;br /&gt;
&lt;pre&gt;&amp;lt;domain connectionurl="sqlserver://./SalesPoint"upgrademode="Skip"&amp;gt;
    &amp;lt;types&amp;gt;
        &amp;lt;add assembly="SalesPoint"&amp;gt;
        &lt;b&gt;&amp;lt;add assembly="Xtensive.Practices.Security"&amp;gt;&lt;/b&gt;
    &amp;lt;/types&amp;gt;
&amp;lt;/domain&amp;gt;
&lt;/pre&gt;Xtensive.Practices.Security contains the following persistent types: Principal, GenericPrincipal (both are abstract) and PrincipalRole which is used for storing role names for a principal.&lt;br /&gt;
&lt;br /&gt;
3. Make your own persistent type that describe a user of your application. Inherit it from Principal or GenericPrincipal classes.&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-m6O3c_xwd2I/TfX7WhJ7MGI/AAAAAAAAAXE/OO4sEN3ewAU/s1600/Principals.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-m6O3c_xwd2I/TfX7WhJ7MGI/AAAAAAAAAXE/OO4sEN3ewAU/s400/Principals.png" width="223" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Principal &lt;/b&gt;class defines the minimum IPrincipal implementation and can be used for all kind of users, no matter whether you use login/password authorization scheme, Windows-based one or your own. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GenericPrincipal&lt;/b&gt; class is specifically designed for login/password authorization scheme. It already contains all the required properties and methods for storing password hash, for setting password, etc. Moreover, generic principal validation service is oriented only on GenericPrincipal class and its inheritors. So, in the overwhelming majority of scenarios you should inherit from GenericPrincipal class.&lt;br /&gt;
&lt;br /&gt;
In the sample the login/password authorization scheme is used, so the Employee class is inherited from the GenericPrincipal one. Note that you have total control on properties of user hierarchy: you define the hierarchy inheritance scheme as well as the structure of Key fields.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[HierarchyRoot]
public class Employee : &lt;b&gt;GenericPrincipal&lt;/b&gt;
{
  [Field, Key]
  public int Id { get; private set; }

  // Other fields
}
&lt;/pre&gt;&lt;br /&gt;
More about principal types: &lt;a href="http://blog.dataobjects.net/2011/05/on-security-system-part-5.html"&gt;part 5&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
4. Define which hashing algorithm will be used. In this version md5, sha1, sha256, sha384, sha512 hashing algorithms are provided plus plain one that allows to store passwords as is, without hashing. This might be useful for testing purposes but it is strongly recommended to use true hashing one in the real life applications. In the sample the plain one is used, here is how it can be configured:&lt;br /&gt;
&lt;pre&gt;&amp;lt;configSections&amp;gt;
    &amp;lt;section name="Xtensive.Security" type="Xtensive.Practices.Security.Configuration.ConfigurationSection, Xtensive.Practices.Security" /&amp;gt;
  &amp;lt;/configSections&amp;gt;

  &amp;lt;Xtensive.Security&amp;gt;
    &amp;lt;hashingService name="plain"/&amp;gt;
  &amp;lt;/Xtensive.Security&amp;gt;
&lt;/pre&gt;If no hashing service is set, then the system will fall back to the 'plain' one.&lt;br /&gt;
&lt;h2&gt;Managing passwords and validating users&lt;/h2&gt;Having the above-mentioned steps done, you are getting the ability to manage users, set their passwords and validate them. Here is how:&lt;br /&gt;
&lt;pre&gt;using (var session = domain.OpenSession()) {
  using (var trx = session.OpenTransaction()) {

    var employee = new Employee(session);
    &lt;b&gt;employee.Name = "Steve Ballmer";
    employee.SetPassword("developers, developers, developers, developers");&lt;/b&gt;
    trx.Complete();
  }
}

using (var session = domain.OpenSession()) {
  using (var trx = session.OpenTransaction()) {

    var employee = &lt;b&gt;session.ValidatePrincipal("Steve Ballmer", "developers, developers, developers, developers");&lt;/b&gt;
    Assert.IsNotNull(employee);
    trx.Complete();
  }
}
&lt;/pre&gt;&lt;h2&gt;Defining roles&lt;/h2&gt;Whereas user management is the essential part of any security system, roles sometimes are used as an optional addition, thus loosing all their power. But it's you who decide whether to employ them or not. In Xtensive.Practices.Security roles are optional too. &lt;br /&gt;
Roles are ordinary classes, not persistent ones, and so are permissions. In order to utilize the roles mechanism you inherit from base Role&amp;lt;T&amp;gt; class and declare permissions for domain model types, like here:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class &lt;b&gt;EmployeeRole : Role&lt;/b&gt;
{
  public EmployeeRole()
  {
    // This is base role for every employee.
    // It defines read-only access to products and employees for all staff.

    // All employees can see products
    RegisterPermission(new Permission&amp;lt;Product&amp;gt;());
    // All employees can see employees
    RegisterPermission(new Permission&amp;lt;Employee&amp;gt;());
  }
}

public class &lt;b&gt;StockManagerRole : EmployeeRole&lt;/b&gt;
{
  public StockManagerRole()
  {
    &lt;b&gt;// Stock manager inherits all permissions from Employee role&lt;/b&gt;
    // In addition, it declares write access to products

    // Stock managers can see and edit products
    RegisterPermission(new Permission&amp;lt;Product&amp;gt;(&lt;b&gt;canWrite:true&lt;/b&gt;));
  }
}
&lt;/pre&gt;&lt;br /&gt;
Here is more advanced role declaration. You can declare secure queries for persistent types and use you own permission classes as well:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class SalesRepresentativeRole : EmployeeRole
{
&lt;b&gt;  private static IQueryable&amp;lt;Order&amp;gt; GetOrdersQuery(ImpersonationContext context, QueryEndpoint query)
  {
    // Sales representative role has access to its own orders only
    return query.All&amp;lt;Order&amp;gt;()
      .Where(o =&amp;gt; o.Employee == context.Principal);
  }&lt;/b&gt;

  public SalesRepresentativeRole()
  {
    // Sales representative inherits Employee permissions

    // Sales representative can see and edit customers
    RegisterPermission(new Permission&amp;lt;Customer&amp;gt;(&lt;b&gt;canWrite:true&lt;/b&gt;));
    // Sales representative can see and edit sale orders but not approve
    RegisterPermission(&lt;b&gt;new OrderPermission(canWrite:true, canApprove:false, GetOrdersQuery)&lt;/b&gt;);
  }
}
&lt;/pre&gt;&lt;b&gt;Important:&lt;/b&gt; for the ease of use give your roles parameterless constructors. If this is unacceptable, then you should provide to a framework a list of role instances. I'll describe this this later.&lt;br /&gt;
&lt;br /&gt;
More about roles and permissions: &lt;a href="http://blog.dataobjects.net/2011/04/on-security-system-part-2.html"&gt;part 2&lt;/a&gt;, &lt;a href="http://blog.dataobjects.net/2011/04/on-security-system-part-3.html"&gt;part 3&lt;/a&gt;, &lt;a href="http://blog.dataobjects.net/2011/04/on-security-system-part-4.html"&gt;part 4&lt;/a&gt;.&lt;br /&gt;
&lt;h2&gt;Impersonation&lt;/h2&gt;The next question after we've successfully defined users, authentication scheme, roles and permissions is "How the hell will these parts work together?". Let's see.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/-JlfQIIm4Pb4/TfYe9CLPqqI/AAAAAAAAAXU/nGtXgMfOnkw/s1600/SalesPointLogin.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="196" src="http://4.bp.blogspot.com/-JlfQIIm4Pb4/TfYe9CLPqqI/AAAAAAAAAXU/nGtXgMfOnkw/s320/SalesPointLogin.png" width="320" /&gt;&lt;/a&gt;You already know how to validate user by the pair of name and password. &lt;br /&gt;
&lt;br /&gt;
If the validation is successful, you may impersonate current Session with user's account. After this is done, the security framework will provide you with all necessary infrastructure on what permission the user has, which roles he is in.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;using (var session = domain.OpenSession()) {
  using (var trx = session.OpenTransaction()) {

    var employee = &lt;b&gt;session.ValidatePrincipal("Steve Ballmer", "developers, developers, developers, developers");&lt;/b&gt;

    // Opening an impersonation context
    var context = session.Impersonate(employee);

    // Checking permissions
    context.Permissions.Contains&amp;lt;Permission&amp;lt;Customer&amp;gt;&amp;gt;(p =&amp;gt; p.CanRead);
    context.Permissions.Contains&amp;lt;OrderPermission&amp;gt;(p =&amp;gt; p.CanApprove);

    // Closing the context
    context.Undo();

    trx.Complete();
  }
}
&lt;/pre&gt;&lt;br /&gt;
Here is how permissions are used to restrict screens of the sample application:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-i_vUV_IZZp4/TfYgZ260udI/AAAAAAAAAXc/LqO0whvrQ3k/s1600/SalesPointPermissions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="483" src="http://4.bp.blogspot.com/-i_vUV_IZZp4/TfYgZ260udI/AAAAAAAAAXc/LqO0whvrQ3k/s640/SalesPointPermissions.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Note that currently logged in employee is in StockManager role that prohibits access to Customers and Orders. The main menu just checks whether current impersonation context contains the appropriate permission and acts accordingly by enabling or disabling controls.&lt;br /&gt;
&lt;br /&gt;
Probably, the most exciting and important feature of the framework is automatic application of secure filters to every query that is being executed through Session.Query endpoint.&lt;br /&gt;
&lt;br /&gt;
For example, if we log in with an employee who is in SalesRepresentative role, which restricts all orders to his own orders only, we will see the following picture:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pSnz7pDks04/TfYigF0TxeI/AAAAAAAAAXk/YbSeVnflK2k/s1600/SalesPointQuery1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="475" src="http://4.bp.blogspot.com/-pSnz7pDks04/TfYigF0TxeI/AAAAAAAAAXk/YbSeVnflK2k/s640/SalesPointQuery1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
We logged in as a Robert King, a sales representative. He can see only his own orders as the filter is declared in SalesRepresentative role and is applied automatically. The application doesn't know about users, permissions, roles, etc. All this stuff is provided by Xtensive.Practices.Security layer. Note that Customers and Orders views are available to him, but the "Approve" button is not, because the role doesn't declare access to "Approve" action.&lt;br /&gt;
&lt;br /&gt;
What will happen if we log in as SalesManager? Let's see:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ri_9Ysobw64/TfYjtc9AOlI/AAAAAAAAAXs/dzNM6zCWURE/s1600/SalesPointQuery2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://2.bp.blogspot.com/-Ri_9Ysobw64/TfYjtc9AOlI/AAAAAAAAAXs/dzNM6zCWURE/s640/SalesPointQuery2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The user also has access to Customers and Orders as SalesManager role inherits it from SalesRepresentative one. Moreover, the role doesn't have such restriction for Orders, the employee see not only his own orders but the orders of employees from his department. In addition, the button "Approve" is enabled.&lt;br /&gt;
&lt;br /&gt;
More on applying security filters to queries: &lt;a href="http://blog.dataobjects.net/2011/06/on-security-system-part-6.html"&gt;part 6&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A few notes about the impersonation context&lt;/b&gt;&lt;br /&gt;
ImpersonationContext class implements IDisposable, so you can employ &lt;i&gt;using&lt;/i&gt; pattern. The context also supports nesting.&lt;br /&gt;
Current impersonation context instance can be accessed through Session, so you don't have to pass the reference to the context everywhere you might need it.&lt;br /&gt;
&lt;pre&gt;var context = session.GetImpersonationContext();
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;How to build the SalesPoint sample application&lt;/b&gt;&lt;br /&gt;
SQL script that builds the required "SalesPoint" database is included into the solution "Samples" and is located in the root folder of the SalesPoint project. Run the script against your database server and check that the database is successfully created. After that update the connectionUrl in app.config file according to the &lt;br /&gt;
path of your database server.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Download&lt;/h2&gt;DataObjects.Net 4.5 Beta 2 can be downloaded from the &lt;a href="http://dataobjects.net/downloads/default.aspx#v-4-5"&gt;website&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
&lt;b&gt;Dear users of DataObjects.Net!&lt;/b&gt;&lt;br /&gt;
This is DataObjects.Net Beta 2, so I'm asking for your feedback. Play with the sample or try creating your own one, try applying the security framework to your real projects, do anything you want with it including the most weird scenarios (I know you can), I'll be happy to receive any comment no matter good or bad from you. Any of these will definitely help to make the product better and keep our requirements for high quality product.&lt;br /&gt;
&lt;br /&gt;
Thank you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-6210057666194694546?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=SfbpzmNrdFM:d_cf-PoflU0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=SfbpzmNrdFM:d_cf-PoflU0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=SfbpzmNrdFM:d_cf-PoflU0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=SfbpzmNrdFM:d_cf-PoflU0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=SfbpzmNrdFM:d_cf-PoflU0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=SfbpzmNrdFM:d_cf-PoflU0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=SfbpzmNrdFM:d_cf-PoflU0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=SfbpzmNrdFM:d_cf-PoflU0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/SfbpzmNrdFM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/6210057666194694546/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/dataobjectsnet-45-beta-2.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6210057666194694546?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6210057666194694546?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/SfbpzmNrdFM/dataobjectsnet-45-beta-2.html" title="DataObjects.Net 4.5 Beta 2" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-XkIh8Snz1Yk/TfYeLUVSqGI/AAAAAAAAAXM/jV9w4QgyB2o/s72-c/SalesPointLogo.png" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/dataobjectsnet-45-beta-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIHQ3YzcCp7ImA9WhZUFUk.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-6430246181876779012</id><published>2011-06-08T21:38:00.000+06:00</published><updated>2011-06-08T21:38:52.888+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-08T21:38:52.888+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="community" /><title>Report about Uganda .NET Usergroup</title><content type="html">Malisa Ncube has written a nice &lt;a href="http://geekswithblogs.net/malisancube/archive/2011/06/08/uganda-.net-usergroupndashmay-2011.aspx"&gt;post&lt;/a&gt; about the event that took place on Friday, 27th May 2011. Malisa presented DataObjects.Net on the meeting and demonstrated how DataObjects.Net fits into Microsoft technology stack.&lt;br /&gt;
&lt;br /&gt;
Don't miss the downloadable presentation. The link is located in the end of his report. Really nice one!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-6430246181876779012?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=dv6IuBwj-lE:O9BvoZmg7Ls:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=dv6IuBwj-lE:O9BvoZmg7Ls:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=dv6IuBwj-lE:O9BvoZmg7Ls:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=dv6IuBwj-lE:O9BvoZmg7Ls:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=dv6IuBwj-lE:O9BvoZmg7Ls:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=dv6IuBwj-lE:O9BvoZmg7Ls:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=dv6IuBwj-lE:O9BvoZmg7Ls:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=dv6IuBwj-lE:O9BvoZmg7Ls:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/dv6IuBwj-lE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/6430246181876779012/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/report-about-uganda-net-usergroup.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6430246181876779012?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/6430246181876779012?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/dv6IuBwj-lE/report-about-uganda-net-usergroup.html" title="Report about Uganda .NET Usergroup" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/report-about-uganda-net-usergroup.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkANRHg7fip7ImA9WhZUFEs.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-450272763778401932</id><published>2011-06-07T21:33:00.000+06:00</published><updated>2011-06-07T21:33:15.606+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-07T21:33:15.606+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="community" /><title>DataObjects.Net Entity Designer update</title><content type="html">Talented Peter Šulek &lt;a href="http://psulek.blogspot.com/2011/06/dataobjectsnet-entity-model-designer.html"&gt;announced&lt;/a&gt; the major update of the Entity Designer project. &lt;br /&gt;
&lt;br /&gt;
The update includes list of bug fixes along with the new important features like POCO/DTO generation support, optional DataContract and DataMember attributes generation, redesigned "Add association" dialog and much more.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RVZnUtkuAx4/Te4yCafx4zI/AAAAAAAAAlw/d28z5naLsP4/s1600/ModelDesignerAddAssociation02.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-RVZnUtkuAx4/Te4yCafx4zI/AAAAAAAAAlw/d28z5naLsP4/s400/ModelDesignerAddAssociation02.jpg" width="292" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Redesigned Association dialog&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Read complete announcement in &lt;a href="http://psulek.blogspot.com/2011/06/dataobjectsnet-entity-model-designer.html"&gt;Peter's blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So, grab the bits and start playing with the tool. Any feedback is highly appreciated. The sooner the designer is tested in various scenarios, the sooner it will be released in production. So, DataObjects.Net community members, participate! Help making the tool perfect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-450272763778401932?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6Fr6_RYuhGA:dkhHrs1LHgg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6Fr6_RYuhGA:dkhHrs1LHgg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=6Fr6_RYuhGA:dkhHrs1LHgg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6Fr6_RYuhGA:dkhHrs1LHgg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=6Fr6_RYuhGA:dkhHrs1LHgg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6Fr6_RYuhGA:dkhHrs1LHgg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=6Fr6_RYuhGA:dkhHrs1LHgg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=6Fr6_RYuhGA:dkhHrs1LHgg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/6Fr6_RYuhGA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/450272763778401932/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/dataobjectsnet-entity-designer-update.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/450272763778401932?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/450272763778401932?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/6Fr6_RYuhGA/dataobjectsnet-entity-designer-update.html" title="DataObjects.Net Entity Designer update" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-RVZnUtkuAx4/Te4yCafx4zI/AAAAAAAAAlw/d28z5naLsP4/s72-c/ModelDesignerAddAssociation02.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/dataobjectsnet-entity-designer-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcFRHw9cSp7ImA9WhZUEUQ.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-3787760810322100886</id><published>2011-06-04T20:16:00.001+06:00</published><updated>2011-06-04T20:16:55.269+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-04T20:16:55.269+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>On security system, part 6</title><content type="html">It seems that in the end of the previous post I was a bit wrong. One more topic left for detailed discussion. And its name is "Query conflicts resolving".&lt;br /&gt;
&lt;br /&gt;
Let me explain it a bit. Say, there is a consulting firm that is managed by 2 managers. First of them, Dan, is responsible for negotiations with automobile companies, while the second one, John, works with aircraft enterprises. According to the approach that is described in the previous set of posts the security domain model would contains of two roles: AutomobileManagerRole and AircraftManagerRole, each of them would include a correspondent restrictive query.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public class AutomobileManagerRole : Role
  {
    private static IQueryable&amp;lt;Customer&amp;gt; GetCustomers(ImpersonationContext context, QueryEndpoint query)
    {
      return query.All&amp;lt;Customer&amp;gt;()
        .Where(c =&amp;gt; c.IsAutomobileIndustry);
    }

    public AutomobileManagerRole()
    {
      RegisterPermission(new CustomerPermission(true, GetCustomers));
    }
  }

  public class AircraftManagerRole : Role
  {
    private static IQueryable&amp;lt;Customer&amp;gt; GetCustomers(ImpersonationContext context, QueryEndpoint query)
    {
      return query.All&amp;lt;Customer&amp;gt;()
        .Where(c =&amp;gt; c.IsAircraftIndustry);
    }

    public AircraftManagerRole()
    {
      RegisterPermission(new CustomerPermission(true, GetCustomers));
    }
  }
&lt;/pre&gt;&lt;br /&gt;
Dan would be associated with AutomobileManagerRole and John - with AircraftManagerRole. The roles effectively avoid both of them to see customers that belong to industry other than a manager is responsible for.&lt;br /&gt;
&lt;br /&gt;
But imagine a situation when one of the managers, let it be Dan, left on a vacation. To continue automobile customers management process John should get access to customers of Dan for the vacation period. To achieve this, a system security administrator goes to a security administration console and temporarily adds AutomobileManagerRole to John's account. As a result, John's account starts containing 2 roles, both of them with restrictive query for customers. &lt;br /&gt;
&lt;br /&gt;
So, what should happen when John will execute a query for customers? How the conflict between 2 restrictive queries should be resolved?&lt;br /&gt;
&lt;br /&gt;
The answer is that if the first role grants access to &lt;b&gt;X&lt;/b&gt; set of entities and the second role grants it to &lt;b&gt;Y&lt;/b&gt; set of entities then the result of combination of these roles should be a &lt;b&gt;union of X and Y&lt;/b&gt;, not intersect or except.&lt;br /&gt;
&lt;br /&gt;
Applying this approach to the situation with the managers, John will get access to the result of the following query:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;query.All&amp;lt;Customer&amp;gt;()
  .Where(c =&amp;gt; c.IsAutomobileIndustry)
  .Union(query.All&amp;lt;Customer&amp;gt;()
        .Where(c =&amp;gt; c.IsAircraftIndustry));
&lt;/pre&gt;&lt;br /&gt;
This approach will be used always when impersonation context is active and user account contains more then one role with a restrictive query for a querying persistent type.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-3787760810322100886?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=o1l63fZOBG4:wGiRGiUk6to:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=o1l63fZOBG4:wGiRGiUk6to:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=o1l63fZOBG4:wGiRGiUk6to:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=o1l63fZOBG4:wGiRGiUk6to:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=o1l63fZOBG4:wGiRGiUk6to:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=o1l63fZOBG4:wGiRGiUk6to:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=o1l63fZOBG4:wGiRGiUk6to:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=o1l63fZOBG4:wGiRGiUk6to:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/o1l63fZOBG4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/3787760810322100886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/06/on-security-system-part-6.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3787760810322100886?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/3787760810322100886?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/o1l63fZOBG4/on-security-system-part-6.html" title="On security system, part 6" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/06/on-security-system-part-6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUARXs7fSp7ImA9WhZVFU0.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-1715766619006072781</id><published>2011-05-27T19:34:00.000+06:00</published><updated>2011-05-27T19:34:04.505+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-27T19:34:04.505+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>On security system, part 5</title><content type="html">After releasing &lt;a href="http://blog.dataobjects.net/2011/05/dataobjectsnet-45-beta-1.html"&gt;DataObjects.Net 4.5 Beta 1&lt;/a&gt; with Firebird &amp; MySQL providers as well as with LINQPad provider, the team switched back to the security-related stuff.&lt;br /&gt;
&lt;br /&gt;
In the &lt;a href="http://blog.dataobjects.net/2011/04/on-security-system-part-4.html"&gt;previous part&lt;/a&gt; we discussed the roles and permissions in terms of restricting LINQ queries. This time let's focus on users, passwords and validation.&lt;br /&gt;
&lt;br /&gt;
First of all, according to the requirements to the security system listed in the &lt;a href="http://blog.dataobjects.net/2011/02/on-security-system-part-1.html"&gt;very first post&lt;/a&gt; concerning this topic, we announced that it would be good if we integrate somehow with the core .NET security interfaces, like IPrincipal &amp; IIdentity. As a result, our core IPrincipal interface inherits System.Security.IPrincipal interface and adds 2 persistent fields and 1 method:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public interface IPrincipal : IEntity, System.Security.Principal.IPrincipal
  {
    [Field]
    string Name { get; }

    [Field]
    [Association(PairTo = "Principal", OnOwnerRemove = OnRemoveAction.Cascade)]
    PrincipalRoleSet PrincipalRoles { get; }

    bool IsInRole(Role role);
  }
&lt;/pre&gt;&lt;br /&gt;
Field 'Name' is used for storing identity information in storage. 'PrincipalRoles' is a set of roles that a principal owns. The PrincipalRole type is just a auxiliary type that help associate a Principal with its roles. A role itself is not persistent type, so we use its name as a reference.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;  [HierarchyRoot]
  [KeyGenerator(KeyGeneratorKind.None)]
  public class PrincipalRole : Entity
  {
    [Field, Key(0)]
    public IPrincipal Principal { get; private set; }

    [Field(Length = 50), Key(1)]
    public string Name { get; private set; }

    public PrincipalRole (Session session, IPrincipal principal, string name)
      : base(session, principal, name) {}
  }
&lt;/pre&gt;&lt;br /&gt;
In order not to realize all functionality of IPrincipal interface by yourselves, there is 2 base implementations: Principal &amp; GenericPrincipal. The first one is pure implementation of the IPrincipal interface with no additional stuff. Here it is:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public abstract class Principal : Entity, IPrincipal
  {
    [NotNullConstraint(Mode = ConstrainMode.OnValidate)]
    [Field(Length = 50, Indexed = true)]
    public string Name { get; set; }

    public virtual IIdentity Identity
    {
      get { return new GenericIdentity(Name); }
    }

    [Field]
    public PrincipalRoleSet PrincipalRoles { get; private set; }

    public bool IsInRole(string role)
    {
      return PrincipalRoles.Any(r =&gt; r.Name == role);
    }

    public bool IsInRole(Role role)
    {
      return PrincipalRoles.Contains(role);
    }
  }
&lt;/pre&gt;&lt;br /&gt;
The second persistent class called GenericPrincipal is designed for use in scenarios with username/password matching:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;public abstract class GenericPrincipal : Principal
  {
    [Field(Length = 50)]
    public string Password { get; protected set; }

    public virtual void SetPassword(string password);
  }
&lt;/pre&gt;Note that both classes neither define Key fields nor apply HierarchyRoot attribute because no prediction can be made about such properties in your domain models. However, this means that you should add your own persistent type called User or similar and inherit from Principal or GenericPrinipal types in order to use all features of the security system. No additional coding is required, just inherit one of them, define Key field(s) and apply HierarchyRoot on top and that's all.&lt;br /&gt;
&lt;br /&gt;
As GenericPrincipal type is intended to be used in username/password scenarios, the next question is: who will be responsible for possible encryption of passwords and how users will be validated/authenticated?&lt;br /&gt;
&lt;br /&gt;
The previous version of DataObjects.Net provided several password encryption algorithms you could choose from, however the possibility to implement your own one was absent. This time we are going to provide a generic interface for string encryption as well as several common implementations. Customers will have the ability to make their own implementations and plug them in. Here is the interface:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;  public interface IEncryptionService : IDomainService
  {
    string Encrypt(string value);
  }
&lt;/pre&gt;&lt;br /&gt;
It is absolutely simple and straightforward. For now there are 2 realizations: PlainEncryptionService that actually doesn't make any encryption at all and could be used for testing purposes, and Md5EncryptionService. I'll show how to configure the services later.&lt;br /&gt;
&lt;br /&gt;
The next part is user authentication. Keeping in mind that DataObjects.Net-based applications might operate with various types of principals, for example, Windows principal or generic one with username/password authorization scheme, we provide the following generic interface for this task:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;  public interface IPrincipalValidationService : ISessionService
  {
    IPrincipal Validate(IIdentity identity, params object[] args);

    IPrincipal Validate(string name, params object[] args);
  }
&lt;/pre&gt;&lt;br /&gt;
The method that takes IIdentity as the first parameter is more generic, it might take WindowsIdentity as well as any other IIdentity descendants. The second argument is an array of values that are used for authentication, these could be passwords, tokens, tickets, you name it. The framework will provide base user validation service for username/password authentication scheme, and you'll have the ability to make your own ones.&lt;br /&gt;
&lt;br /&gt;
It seems that there is nothing left to describe. In the next part we'll try making our first sample with integrated security. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-1715766619006072781?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gAsgR-U2qGw:jbeUCdkESuM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gAsgR-U2qGw:jbeUCdkESuM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=gAsgR-U2qGw:jbeUCdkESuM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gAsgR-U2qGw:jbeUCdkESuM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=gAsgR-U2qGw:jbeUCdkESuM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gAsgR-U2qGw:jbeUCdkESuM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=gAsgR-U2qGw:jbeUCdkESuM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=gAsgR-U2qGw:jbeUCdkESuM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/gAsgR-U2qGw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/1715766619006072781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/05/on-security-system-part-5.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/1715766619006072781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/1715766619006072781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/gAsgR-U2qGw/on-security-system-part-5.html" title="On security system, part 5" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/05/on-security-system-part-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUFSHw6eCp7ImA9WhZVEkk.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-5053069675236060107</id><published>2011-05-24T20:43:00.000+06:00</published><updated>2011-05-24T20:43:39.210+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-24T20:43:39.210+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>DataObjects.Net on Uganda .NET Usergroup</title><content type="html">Hello All,&lt;br /&gt;
&lt;br /&gt;
On Friday, 27th May 2011 Malisa Ncube will present DataObjects.Net on Uganda .NET Usergroup meeting and demonstrate how DataObjects.Net fits into Microsoft technology stack and how software engineers can accelerate project development using the application framework.&lt;br /&gt;
&lt;br /&gt;
It is a completely free event. If you’d like to attend, please &lt;a href="http://www.eventbrite.com/event/1729782827"&gt;register here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-5053069675236060107?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nQYShL9Up2w:u_g41ZqMeV4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nQYShL9Up2w:u_g41ZqMeV4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=nQYShL9Up2w:u_g41ZqMeV4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nQYShL9Up2w:u_g41ZqMeV4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=nQYShL9Up2w:u_g41ZqMeV4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nQYShL9Up2w:u_g41ZqMeV4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=nQYShL9Up2w:u_g41ZqMeV4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=nQYShL9Up2w:u_g41ZqMeV4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/nQYShL9Up2w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/5053069675236060107/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/05/dataobjectsnet-on-uganda-net-usergroup.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/5053069675236060107?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/5053069675236060107?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/nQYShL9Up2w/dataobjectsnet-on-uganda-net-usergroup.html" title="DataObjects.Net on Uganda .NET Usergroup" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/05/dataobjectsnet-on-uganda-net-usergroup.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4HRH8-fyp7ImA9WhZWF00.&quot;"><id>tag:blogger.com,1999:blog-3955624781368590602.post-5531775508806857289</id><published>2011-05-18T14:55:00.000+06:00</published><updated>2011-05-18T14:55:35.157+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-18T14:55:35.157+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title>DataObjects.Net 4.5 Beta 1</title><content type="html">Today the DataObjects.Net Team is releasing the first beta of the upcoming 4.5 version of DataObjects.Net.&lt;br /&gt;
&lt;br /&gt;
In this release are included both new providers: for Firebird 2.x &amp; for MySQL 5.x as well as the LINQPad provider.&lt;br /&gt;
&lt;br /&gt;
Both stable versions are also updated to the latest revision. Issues resolved:&lt;br /&gt;
&lt;br /&gt;
- &lt;a href="http://support.x-tensive.com/question/4125/index-attribute-on-abstract-class-not-in-hierarchy-root"&gt;Index attribute on abstract class not in hierarchy root&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://support.x-tensive.com/question/4280/no-foreign-key-on-field-from-interface"&gt;No Foreign Key on field from Interface&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://support.x-tensive.com/question/4260/bug-of-inheritance-with-non-open-generic"&gt;Bug of Inheritance with non open generic&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://support.x-tensive.com/question/4285/unsufficient-error-message-when-domain-build"&gt;Unsufficient error message when domain build&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://support.x-tensive.com/question/4279/structure-field-migration"&gt;Structure field migration&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The beta as well as stable versions are available in &lt;a href="http://dataobjects.net/downloads/default.aspx"&gt;the download section&lt;/a&gt; of the official website.&lt;br /&gt;
&lt;br /&gt;
Please, report any issues concerning new providers so we could fix them before the final version is released. Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3955624781368590602-5531775508806857289?l=blog.dataobjects.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=xb25FXgf3No:mGTPaWHd38g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=xb25FXgf3No:mGTPaWHd38g:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=xb25FXgf3No:mGTPaWHd38g:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=xb25FXgf3No:mGTPaWHd38g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=xb25FXgf3No:mGTPaWHd38g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=xb25FXgf3No:mGTPaWHd38g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DataObjects?a=xb25FXgf3No:mGTPaWHd38g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DataObjects?i=xb25FXgf3No:mGTPaWHd38g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DataObjects/~4/xb25FXgf3No" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.dataobjects.net/feeds/5531775508806857289/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.dataobjects.net/2011/05/dataobjectsnet-45-beta-1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/5531775508806857289?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3955624781368590602/posts/default/5531775508806857289?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DataObjects/~3/xb25FXgf3No/dataobjectsnet-45-beta-1.html" title="DataObjects.Net 4.5 Beta 1" /><author><name>Dmitri Maximov</name><uri>http://www.blogger.com/profile/07143844311415529548</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://3.bp.blogspot.com/_iHnCjIZdGL8/SrpC7xW7MmI/AAAAAAAAACQ/7WulpzWqqnY/S220/me.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.dataobjects.net/2011/05/dataobjectsnet-45-beta-1.html</feedburner:origLink></entry></feed>

