<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>The Kinetic Framework</title><link>http://www.codeplex.com/kineticframework/Project/ProjectRss.aspx</link><description>The Kinetic Framework is an extensible business and data layer framework.  It is built as a set of CodeSmith templates.  The templates generate a strongly typed C&amp;#35; domain model based off your SQL 2...</description><item><title>New Post: Dealing with Many-to-Many Relationships</title><link>http://www.codeplex.com/kineticframework/Thread/View.aspx?ThreadId=34657</link><description>&lt;div style="line-height: normal;"&gt;Jazza,&lt;br&gt;
&lt;br&gt;
You are correct - we put nothing in specifically for Many-To-Many relationships at this point. If you set the two fields in your lookup table as the primary key for that table (or add another key), you can get to the many to many relationship through that table.&lt;br&gt;
&lt;br&gt;
For example, if you have these three tables: Employees, Clients and a table managing which employees have talked to which clients (EmployeeClientContacts), from the Employee object, you can go employee.EmployeeClientContacts to get the list - then each one of those has a .Customer property that contains the customer.&lt;br&gt;
&lt;br&gt;
It's not as seemless as a true many-to-many relationship, but it also allows you to manage any meta data in the link table, so that's what we stuck with for now.&lt;br&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Mon, 01 Sep 2008 13:31:18 GMT</pubDate><guid isPermaLink="false">New Post: Dealing with Many-to-Many Relationships 20080901013118P</guid></item><item><title>New Post: Dealing with Many-to-Many Relationships</title><link>http://www.codeplex.com/kineticframework/Thread/View.aspx?ThreadId=34657</link><description>&lt;div style="line-height: normal;"&gt;Hi, how does the framework deal with many-to-many relationships? I am using the framework against a database where I have two tables, each with their own primary key, but joined by a lookup table which has no primary key of its own. In&amp;nbsp;a previous discussion on this subject, you said that you hoped a solution would be in place for version 2.0, but I have version 3.0 and it does not appear to be fixed.
&lt;/div&gt;</description><author>Jazza</author><pubDate>Mon, 01 Sep 2008 09:28:58 GMT</pubDate><guid isPermaLink="false">New Post: Dealing with Many-to-Many Relationships 20080901092858A</guid></item><item><title>Source code checked in, #21198</title><link>http://www.codeplex.com/kineticframework/SourceControl/ListDownloadableCommits.aspx</link><description>Validation error was getting instantiated for nvarchar&amp;#40;max&amp;#41; property, comparing against -1 for the length of the field.</description><author>markjjordan</author><pubDate>Wed, 30 Jul 2008 13:37:51 GMT</pubDate><guid isPermaLink="false">Source code checked in, #21198 20080730013751P</guid></item><item><title>Source code checked in, #21185</title><link>http://www.codeplex.com/kineticframework/SourceControl/ListDownloadableCommits.aspx</link><description>Now handling varbinary&amp;#40;max&amp;#41; correctly when generating T-SQL in entity generated classes.</description><author>markjjordan</author><pubDate>Wed, 30 Jul 2008 12:32:08 GMT</pubDate><guid isPermaLink="false">Source code checked in, #21185 20080730123208P</guid></item><item><title>Source code checked in, #20700</title><link>http://www.codeplex.com/kineticframework/SourceControl/ListDownloadableCommits.aspx</link><description>Add new templates</description><author>RossCode</author><pubDate>Thu, 24 Jul 2008 04:27:13 GMT</pubDate><guid isPermaLink="false">Source code checked in, #20700 20080724042713A</guid></item><item><title>Source code checked in, #20699</title><link>http://www.codeplex.com/kineticframework/SourceControl/ListDownloadableCommits.aspx</link><description>Added IDataHelper and IDataFactory interfaces. Updated SqlHelper class to implement IDataHelper interface. Added ServiceLocator to handle updated factory dependencies.</description><author>RossCode</author><pubDate>Thu, 24 Jul 2008 04:26:20 GMT</pubDate><guid isPermaLink="false">Source code checked in, #20699 20080724042620A</guid></item><item><title>Source code checked in, #20126</title><link>http://www.codeplex.com/kineticframework/SourceControl/ListDownloadableCommits.aspx</link><description>Update for naming change to Kinetic Framework.</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 17:46:21 GMT</pubDate><guid isPermaLink="false">Source code checked in, #20126 20080717054621P</guid></item><item><title>Released: Kinetic Framework 3.0 (Apr 03, 2008)</title><link>http://www.codeplex.com/kineticframework/Release/ProjectReleases.aspx?ReleaseId=7335</link><description>&lt;div&gt;
Kinetic Framework 3.0 includes the following new features:&lt;br&gt; &lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Validation Support&lt;/b&gt;: We added validation of properties to determine if fields are required and that strings are less than the max length. This is extendable through overrides and events, so you can add your own validations pretty easily. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Logging Support&lt;/b&gt;: This was one of those things we struggled with. We didn't want to add a dependency in the framework to a particular logging framework, so instead of adding logging support directly, we added the hooks so you could log what you wanted to log. Most of what we could come up with had to do with logging SQL queries, so we made the SqlHelper a partial class and added a base class, so you could add the logging by overriding OnExecuting and OnExecuted. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Database-based Paging and sorting&lt;/b&gt;: We've added a bunch of overloads to Get&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=Entity"&gt;Entity&lt;/a&gt;() methods to allow you to page at the database level. &lt;/li&gt;
&lt;/ul&gt;We also fixed a few bugs that were brought to our attention. Documentation is a bit lite right now, but we're working on it!&lt;br&gt;
&lt;/div&gt;</description><author></author><pubDate>Thu, 17 Jul 2008 02:09:09 GMT</pubDate><guid isPermaLink="false">Released: Kinetic Framework 3.0 (Apr 03, 2008) 20080717020909A</guid></item><item><title>UPDATED RELEASE: Kinetic Framework 3.0 (Apr 03, 2008)</title><link>http://www.codeplex.com/kineticframework/Release/ProjectReleases.aspx?ReleaseId=7335</link><description>&lt;div&gt;
Kinetic Framework 3.0 includes the following new features:&lt;br&gt; &lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Validation Support&lt;/b&gt;: We added validation of properties to determine if fields are required and that strings are less than the max length. This is extendable through overrides and events, so you can add your own validations pretty easily. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Logging Support&lt;/b&gt;: This was one of those things we struggled with. We didn't want to add a dependency in the framework to a particular logging framework, so instead of adding logging support directly, we added the hooks so you could log what you wanted to log. Most of what we could come up with had to do with logging SQL queries, so we made the SqlHelper a partial class and added a base class, so you could add the logging by overriding OnExecuting and OnExecuted. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Database-based Paging and sorting&lt;/b&gt;: We've added a bunch of overloads to Get&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=Entity"&gt;Entity&lt;/a&gt;() methods to allow you to page at the database level. &lt;/li&gt;
&lt;/ul&gt;We also fixed a few bugs that were brought to our attention. Documentation is a bit lite right now, but we're working on it!&lt;br&gt;
&lt;/div&gt;</description><author></author><pubDate>Thu, 17 Jul 2008 02:09:09 GMT</pubDate><guid isPermaLink="false">UPDATED RELEASE: Kinetic Framework 3.0 (Apr 03, 2008) 20080717020909A</guid></item><item><title>Updated Wiki: RoadMap</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=RoadMap&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Kinetic Framework Road Map
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Version 3.0
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Add Validation Support&lt;/li&gt;&lt;li&gt;Add Logging Support&lt;/li&gt;&lt;li&gt;Add database based paging and sorting&lt;/li&gt;&lt;li&gt;timestamp field support&lt;/li&gt;&lt;li&gt;Add DeleteAll and SetAllDeleted() methods to EntityList&lt;/li&gt;&lt;li&gt;Enhance FindEntity() and FindEntities() to work more like EntityComparer does (support searching on multiple properties)&lt;/li&gt;&lt;li&gt;Fix naming conflicts with composite foreign keys&lt;/li&gt;&lt;li&gt;Add ability to refresh entity from database&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;h2&gt;
Version 4.0
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;LINQ support&lt;/li&gt;&lt;li&gt;WCF support&lt;/li&gt;&lt;li&gt;Caching&lt;/li&gt;&lt;li&gt;Nullable type support&lt;/li&gt;&lt;li&gt;Deep loading of entities&lt;/li&gt;&lt;li&gt;Add Copy constructors&lt;/li&gt;&lt;li&gt;Add custom queries based on indexes in database&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 02:06:51 GMT</pubDate><guid isPermaLink="false">Updated Wiki: RoadMap 20080717020651A</guid></item><item><title>Updated Wiki: Upgrading</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=Upgrading&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Upgrading The Kinetic Framework
&lt;/h1&gt; &lt;br /&gt;&lt;b&gt;Upgrading from 1.x to 2.0&lt;/b&gt;&lt;br /&gt;The Kinetic Framework version 1.0 was only released internally at NuSoft Solutions (now RCM Technologies), so this information is primarily pertinent to projects used within RCM Technologies.&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 02:03:40 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Upgrading 20080717020340A</guid></item><item><title>Updated Wiki: WhatTheNuSoftFrameworkGivesYou</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=WhatTheNuSoftFrameworkGivesYou&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
What Is Generated By The Kinetic Framework?
&lt;/h1&gt; &lt;br /&gt;You just generated your business framework. Great. Now you're ready to go!&lt;br /&gt; &lt;br /&gt;But what exactly did you get? &lt;br /&gt; &lt;br /&gt;In your root folder, you should have a solution file, named after your Namespace you used while generating. You'll also have another folder named after your DomainNamespace you used when generating. If you selected StoredProcedures for your SQLType, then you'll also have a Database folder.&lt;br /&gt; &lt;br /&gt;In that Database folder, you'll find a database project, with the standard folders it starts with, but under the Create Scripts folder, you have a Stored Procedures folder, which has all of your scripts in it. They are all in separate files, and you'll need to run these against the database before you get too far.&lt;br /&gt; &lt;br /&gt;In the other folder (Domain, Business, Core, or whatever you called it) is the core of the framework. The files in here are your business entities. Each one has a &amp;lt;entity&amp;gt;.cs file and a Generated.&amp;lt;entity&amp;gt;.cs file. When you open the project, the Generated.&amp;lt;entity&amp;gt;.cs file will be a sub-item of the &amp;lt;entity&amp;gt;.cs file, so it's there, but hidden.&lt;br /&gt; &lt;br /&gt;In the Framework folder, you'll find the standard files for the Kinetic Framework:&lt;br /&gt; &lt;br /&gt;1. &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=EntityBase&amp;amp;referringTitle=WhatTheNuSoftFrameworkGivesYou"&gt;EntityBase&lt;/a&gt; - every entity inherits from EntityBase. This provides a default set of methods and properties, default implementations for some methods, and a definition of a standard interface our entities will have. This is also responsible for loading and initializing entities from database readers.&lt;br /&gt;2. EntityList - this provides us with a custom generic collection we can use for lists of our entities. It handles loading and saving of child collections for an entity.&lt;br /&gt;3. EntityListReadOnly - this gives us a way to have a read-only collection that will not get saved when we update our entities.&lt;br /&gt;4. &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=DatabaseColumnAttribute&amp;amp;referringTitle=WhatTheNuSoftFrameworkGivesYou"&gt;DatabaseColumnAttribute&lt;/a&gt; - we use this attribute in our entities to flag a column as coming from the database. You can use this in your own custom objects to have them loaded automatically by the framework.&lt;br /&gt;5. &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=EntityEventArgs&amp;amp;referringTitle=WhatTheNuSoftFrameworkGivesYou"&gt;EntityEventArgs and EntityCancelEventArgs&lt;/a&gt; - our entities have a few events that you can handle, and we pass along custom event arguments. We typically have an &amp;quot;ing&amp;quot; and a &amp;quot;ed&amp;quot; event - Saving and Saved, Inserting and Inserted, etc. The &amp;quot;ing&amp;quot; event will use the EntityCancelEventArgs, which allows the handler to cancel the pending event. So by saying e.Cancel = true; in the Saving event, we can prevent a Save from happening.&lt;br /&gt;6. &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=SqlHelper&amp;amp;referringTitle=WhatTheNuSoftFrameworkGivesYou"&gt;SqlHelper&lt;/a&gt; - this is a fairly standard SQL Helper class that allows us to access SQL Server. It relies on a ConnectionString being in the ConnectionStrings section of your config file, and it should be called &amp;quot;ConnString&amp;quot; - yes, it's limited, and it's on our list of updates to make.&lt;br /&gt;7. &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=FrameworkInterfaces&amp;amp;referringTitle=WhatTheNuSoftFrameworkGivesYou"&gt;ISearchable and ISavable&lt;/a&gt;: Two interfaces that are used to specifiy that our list is searchable and that our entities are savable. &lt;br /&gt;8. &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=MinToEmptyTypeConverter&amp;amp;referringTitle=WhatTheNuSoftFrameworkGivesYou"&gt;MinToEmptyTypeConverter&lt;/a&gt;: An attribute to make a friendly display of min values.&lt;br /&gt; &lt;br /&gt;I'll go into more details on the framework files at another time. For now, that's good enough to get you going.&lt;br /&gt; &lt;br /&gt;Back to the domain folder. The &amp;lt;entity&amp;gt;.cs file will be where you'll add your custom code. The Generated.&amp;lt;entity&amp;gt;.cs file is designed to be left alone, so it can be regenerated if you need to. This isn't a hard and fast rule, but be aware that the file will get overwritten if you regenerate.&lt;br /&gt; &lt;br /&gt;The Generated.&amp;lt;entity&amp;gt;.cs file has most of the guts of your business entities in it. It has all of the properties for each database column. It has Properties for foreign key relationships - an Order will have a Customer property for the customer who owns the order. It will also have collections for entites that have foreign keys to it - an Order will have a collection of OrderDetails. There are static methods to create each object, as well as member methods to create objects - if you have an Order object called order, you can call order.CreateOrderDetail(); to get a new OrderDetail object that is related to the Order. It has a public Save() method that knows what children objects need to be saved - if you have a customer entity, change the name, add an order with two order lines, and call customer.Save() it will update the customer, insert the Order and insert all of the OrderDetail rows. There's more, which I'll cover later in more details.&lt;br /&gt; &lt;br /&gt;Lastly, you'll get a project file that includes all of the above files.&lt;br /&gt; &lt;br /&gt;Open the solution, build, and you're ready to add your UI to the solution!&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 02:01:34 GMT</pubDate><guid isPermaLink="false">Updated Wiki: WhatTheNuSoftFrameworkGivesYou 20080717020134A</guid></item><item><title>Updated Wiki: SolutionItems</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=SolutionItems&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Use Solution Items To Manage Kinetic Framework Code Changes
&lt;/h1&gt;We recommend adding the zip file of the changeset or release you downloaded and used to generate your code framework to your Visual Studio project as a solution item.  When you regenerate your framework you should use the stored solution item copy of the framework instead of downloading the latest change set of the framework.&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:59:41 GMT</pubDate><guid isPermaLink="false">Updated Wiki: SolutionItems 20080717015941A</guid></item><item><title>Updated Wiki: ExtendingTheNuSoftFramework</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ExtendingTheNuSoftFramework&amp;version=7</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Extending The Kinetic Framework
&lt;/h1&gt; &lt;br /&gt;Ok. So you've been using the Kinetic framework (or you haven't, but are thinking about it). One thing keeps nagging you, though.&lt;br /&gt; &lt;br /&gt;What if I want to do something that's not in the framework by default? &lt;br /&gt; &lt;br /&gt;Good question! The framework is built to be very flexible and allow you to do just that! If you're talking about extending Entities, there's two major ways:&lt;br /&gt; &lt;br /&gt;1. Add functionality to an existing entity &lt;br /&gt;2. Make a new entity based on an existing entity &lt;br /&gt; &lt;br /&gt;Sticking with the Northwind database as a reference, let's say you want to change a few things when working with a Customer object. First, we'll look at adding functionality to an existing entity. A customer has orders, and an order has order lines, and order lines have products they are associated with. But a customer has no direct association with a product. What if we want to see a list of all products that a customer has purchased? Ideally, if we have a Customer entiity called customer, it would be nice to have that stored in a customer.Products property. But it's not there. &lt;br /&gt; &lt;br /&gt;This is where adding functionality to an existing class comes in handy. We can add any functionality we want in the Customer.cs class file. We add the Product collection, and, following the pattern of lazy loading, we get this:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
private EntityListReadOnly&amp;lt;Product&amp;gt; _products = null;
public EntityListReadOnly&amp;lt;Product&amp;gt; Products
{
   get
   {
      If(_products == null)
     {
        _products = Product.GetProductsByCustomer(this);
     }
     return _products;
   }
}
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;We don't have a setter because we can't directly change this collection - it's just a roll up of data available other ways in the system.&lt;br /&gt; &lt;br /&gt;All set then, right? Well, not quite. We did the easy part. We have a collection, and we lazy load it. But where do we lazy load it from? The Product entity, but right now, it doesn't have a method for that. So, we need to add one:&lt;br /&gt;&lt;pre&gt;
public static EntityList&amp;lt;Product&amp;gt; GetProductsByCustomer(Customer customer)
{
  string commandText = &amp;quot;ProductGetByCustomer&amp;quot;;
  List&amp;lt;SqlParameter&amp;gt; parameters = new List&amp;lt;SqlParameter&amp;gt;();
  parameters.add(new SqlParameter(&amp;quot;@CustomerId&amp;quot;, customer.CustomerId));
  return GetList&amp;lt;Product&amp;gt;(customer, commandText, parameters);
}
&lt;/pre&gt; &lt;br /&gt;Obviously you need to create the stored procedure for getting products by customer, or if you decide to use dynamic SQL, then you can just write the SQL right here. In that version, it'd look something like this:&lt;br /&gt;&lt;pre&gt;
public static EntityList&amp;lt;Product&amp;gt; GetProductsByCustomer(Customer customer)
{
  string commandText = @&amp;quot;
  SELECT DISTINCTProducts.*
  FROM Products
  INNER JOIN OrderDetails 
  ON OrderDetails.ProductId = Products.ProductId
  INNER JOIN Orders 
  ON Orders.OrderId = OrderDetails.OrderId
  WHERE Orders.CustomerId = @CustomerId;&amp;quot;;
 
  List&amp;lt;SqlParameter&amp;gt; parameters = new List&amp;lt;SqlParameter&amp;gt;();
  parameters.add(new SqlParameter(&amp;quot;@CustomerId&amp;quot;, customer.CustomerId));
  return GetList&amp;lt;Product&amp;gt;(commandText, parameters);
}
&lt;/pre&gt; &lt;br /&gt;Now, when you call customer.Products, you'll get a collection of all products that the customer has ordered. That's it!&lt;br /&gt; &lt;br /&gt;The second way to extent the framework is to inherit from an object. So let's do that. Let's create a summary customer object that shows how many orders each customer has. We could get that info another way - customer.Orders.Count, but that would require loading every order just to get the count - not efficient at all, especially if you want to display a list of customers.&lt;br /&gt; &lt;br /&gt;So what can we do? We want the customer info, plus some more data, so we start with the customer entity as our base, and add a property for the number of orders&lt;br /&gt;&lt;pre&gt;
public class CustomerSummary : Customer
{
  protected CustomerSummary() { }
 
  private int _numberOfOrders;
  {&amp;quot;[DatabaseColumn()]&amp;quot;}
  public int NumberOfOrders
  {
    get { return _numberOfOrders; }
    protected set { _numberOfOrders = value; }
  }
}
&lt;/pre&gt; &lt;br /&gt;Let's back up and explain a few things. We have a protected CustomerSummary constructor for two reasons: First, it follows the framework's pattern of using Factory methods to get and/or create entities. Second, a CustomerSummary object isn't what you'd be using to create a new customer - it's meant for displaying data. The DatabaseColumn() attribute is added to the NumberOfOrders property to tell the framework to expect this value to be retrieved when we run stored procedures or queries to get CustomerSummary objects. Now, like I said before, the CustomerSummary is read-only, so why do we have a setter for NumberOfOrders? Because that's the setter that the framework will use to populate the number of orders. We make it protected so only the framework can get access to it.&lt;br /&gt; &lt;br /&gt;Next we need a method to get CustomerSummary objects:&lt;br /&gt;&lt;pre&gt;
public EntityList&amp;lt;CustomerSummary&amp;gt; GetCustomerSummaries()
{
  string commandText = &amp;quot;CustomerSummaryGet&amp;quot;;
  list&amp;lt;SqlParameter&amp;gt; parameters = new List&amp;lt;SqlParameter&amp;gt;();
  return GetList&amp;lt;CustomerSummary&amp;gt;(commandText, parameters);
}
&lt;/pre&gt; &lt;br /&gt;To better reflect what's happening, let's take a look at the Dynamic SQL version:&lt;br /&gt;&lt;pre&gt;
public EntityList&amp;lt;CustomerSummary&amp;gt; GetCustomerSummaries()
{
  string commandText = @&amp;quot;
  SELECT 
  Customers.*,
  COUNT(Orders.OrderID) AS 'NumberOfOrders'
  FROM Customers
  INNER JOIN Orders
  ON Customers.CustomerID = [Orders.[CustomerID]
  GROUP BY
  Customers.*
  &amp;quot;;
 
  list&amp;lt;SqlParameter&amp;gt; parameters = new List&amp;lt;SqlParameter&amp;gt;();
  return GetList&amp;lt;CustomerSummary&amp;gt;(commandText, parameters);
}
&lt;/pre&gt; &lt;br /&gt;First, no, I'm not positive that the group by clause works - basically, it's a listing of all of the fields in the Customer table (starting with CustomerID, since it's unique) because having a count() in your query requires that you group by all of the other fields in the query.&lt;br /&gt; &lt;br /&gt;Anyway, does that look familiar? It should. It's very similar to what we had to add to the Product class to get a list of products by customer - the query is different, but the rest of the calls are the same. The call to GetList() is slightly different because it specifies we're getting a list of CustomerSummary entities instead of Product entities, but that's it. The pattern for getting a list of objects is the same whether you are working in a framework generated object or you inherit from one.&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:58:44 GMT</pubDate><guid isPermaLink="false">Updated Wiki: ExtendingTheNuSoftFramework 20080717015844A</guid></item><item><title>Updated Wiki: AdvancedTopics</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=AdvancedTopics&amp;version=9</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Advanced Topics
&lt;/h1&gt; &lt;br /&gt;Understanding these concepts will help you get the most out of the Kinetic Framework.&lt;br /&gt;&lt;h2&gt;
Key Concepts
&lt;/h2&gt;&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ExtendingTheNuSoftFramework&amp;amp;referringTitle=AdvancedTopics"&gt;Extending The Kinetic Framework&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=SolutionItems&amp;amp;referringTitle=AdvancedTopics"&gt;Using Solution Items To Manage Change&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ChangeClassNames&amp;amp;referringTitle=AdvancedTopics"&gt;Changing Class Names That Are Generated&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ActiveGeneration&amp;amp;referringTitle=AdvancedTopics"&gt;The Kinetic Framework and Active Generation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=WhatTheNuSoftFrameworkGivesYou&amp;amp;referringTitle=AdvancedTopics"&gt;What Is Generated By The Kinetic Framework?&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;RCM Users&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=Upgrading&amp;amp;referringTitle=AdvancedTopics"&gt;Upgrading From 1.x To 2.*&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:53:30 GMT</pubDate><guid isPermaLink="false">Updated Wiki: AdvancedTopics 20080717015330A</guid></item><item><title>Updated Wiki: CodeExamples</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=CodeExamples&amp;version=17</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Step 3: Write Code
&lt;/h1&gt; &lt;br /&gt;Now your framework is generated and you are ready to write your custom code.  Add the a reference to your generated framework to your UI project.  Then add a using statement to your namespace within your ASPX code behind and you are ready to go.  Here is some sample code for working with an entity generated by the Kinetic Framework..  Let's say you generated some code from the &lt;a href="http://www.codeplex.com/MSFTDBProdSamples" class="externalLink"&gt;Adventure Works&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; sample database.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Get a collection contacts&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;
EntityList&amp;lt;Contact&amp;gt; contacts = AdventureWorks.Business.Contact.GetContacts();
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Get one contact&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;
Contact contact = AdventureWorks.Business.Contact.GetContact(1);
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Create a new contact&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;
Contact contact = AdventureWorks.Business.Contact.CreateContact();
contact.FirstName = &amp;quot;my first&amp;quot;;
contact.LastName = &amp;quot;user&amp;quot;;
contact.Save();
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Update a contact&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;
Contact contact = AdventureWorks.Business.Contact.GetContact(1);
contact.FirstName = &amp;quot;my first&amp;quot;;
contact.LastName = &amp;quot;user&amp;quot;;
contact.Save();
&lt;/pre&gt; &lt;br /&gt;&lt;i&gt;Note: All saves are recursive so if you update or add child objects they will also be updated / added when you save the parent object.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Delete a contact&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;
Contact contact = AdventureWorks.Business.Contact.GetContact(1);
contact.Delete();
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;Those are the basics.  Review the &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=AdvancedTopics&amp;amp;referringTitle=CodeExamples"&gt;advanced topics&lt;/a&gt; area to get more insights into how to get the most out of the Kinetic Framework.&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:50:53 GMT</pubDate><guid isPermaLink="false">Updated Wiki: CodeExamples 20080717015053A</guid></item><item><title>Updated Wiki: ChangeClassNames</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ChangeClassNames&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
How are class names deteremined in the Kinetic Framework?
&lt;/h1&gt;We try to support databases that use plural names for tables as well as databases that use singular names for tables. Our default model is to create classes with singular names and collections of classes with plural names. We use the built-in string utilities in CodeSmith to convert from plural names to singular names and singular names to plural names. We understand this isn't perfect, and offer other a way to override class naming. There are two Extended Properties you can add to a table to affect how naming works:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;NSFx_EntityName&lt;/b&gt;: This will be the class name for the entity.&lt;/li&gt;&lt;li&gt;&lt;b&gt;NSFx_EntityPluralName&lt;/b&gt;: This will be used for any collections of this type of entity.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms190243.aspx" class="externalLink"&gt;Learn more about SQL extended properties&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:49:52 GMT</pubDate><guid isPermaLink="false">Updated Wiki: ChangeClassNames 20080717014952A</guid></item><item><title>Updated Wiki: ActiveGeneration</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ActiveGeneration&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Understanding Active Generation
&lt;/h1&gt; &lt;br /&gt;The Kinetic Framework is meant to be a combination of passive and active code generation. Passive generation is a &amp;quot;one time&amp;quot; generation - a keystroke saver. Active generation means you can regenerate your code at any time. Certain files created by the framework are passive - one time generated files. Most of the &amp;quot;guts&amp;quot; of the generated code is actively generated - they are overwritten whenever you regenerate - and that's a good thing! Imagine the scenario below:&lt;br /&gt; &lt;br /&gt;You've been working on your project for a couple of months, and think to yourself, &amp;quot;What if I added coupon codes to the order so customers could get a discount?&amp;quot; Your response: &amp;quot;Sure, I can do that!&amp;quot;&lt;br /&gt; &lt;br /&gt;But what you're really thinking is: &amp;quot;Now I have to add a CouponId to the Orders table, and add a Coupons table to the database. Then what am I going to do about my generated code? I've put modifications all over the place, and I don't want to lose them!&amp;quot;&lt;br /&gt; &lt;br /&gt;One solution is to regenerate in another folder and merge your changes by hand. But that's error prone, and relies on you remembering all objects that might be touched by your change.&lt;br /&gt; &lt;br /&gt;With the Kinetic Framework and the passive/active generation combo, there's another option. Regenerate over the top of what you already have. The framework is designed to respect your changes and ensure you don't lose changes you've made. Some files will get overwritten, but if you follow a few guidelines about where you make modifications, then you should be OK. Before the guidelines, though, here's what gets overwritten when you regenerate:&lt;br /&gt; &lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Any generated.&amp;lt;entity&amp;gt;.cs files: These are generated files, and aren't meant to be modified, so the framework will regenerate these every time. In the change above, this is what would add the CouponId property to your Order object, as well as give you a reference to the Coupon object. The .cs file will not be overwritten if it exists, but if it does not exist, then it will be created. So, in the above example, a Coupon.cs and Generated.Coupon.cs file will be generated.&lt;/li&gt;&lt;li&gt;Framework/.: All files created by the Kinetic Framework and placed in the Framework folder will be overwritten. It's all generic code in there, so it gets overwritten whenever you generate.&lt;/li&gt;&lt;li&gt;Stored Procedures: If you're using stored procedures for your data access, then all of the stored procedures will be overwritten. You'll still have to run them against your database, but the files will be updated. This is important since all of the Order stored procedures would be out of date if you added the CouponId field.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;Now, here's what isn't listed here: any solution or project files and your custom entity classes. Those don't get overwritten, so if you add a new entity, such as Coupon, you'll have to include that class in your projects manually - both the .cs file and .generated.cs file. Same thing with the stored procedures - they don’t get automatically included in the database project file. And if you add any custom code to your .cs files, that's also preserved.&lt;br /&gt; &lt;br /&gt;End result: you can safely regenerate your entities without fear of losing code if you follow a few guidelines: Don't modify files in the Framework folder and add your custom code to the .cs entity file, leaving the generated.&amp;lt;entity&amp;gt;.cs entity files alone.&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:47:24 GMT</pubDate><guid isPermaLink="false">Updated Wiki: ActiveGeneration 20080717014724A</guid></item><item><title>Updated Wiki: GettingStarted</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=GettingStarted&amp;version=28</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Kinetic Framework Documentation
&lt;/h1&gt;&lt;h2&gt;
Step 1: Generate The Framework
&lt;/h2&gt; &lt;br /&gt;There are two major requirements before you can start using the Kinetic Framework. First, you need Codesmith 4.1 or later. It does not require the full version of CodeSmith Professional - you can generate with the $99 basic version. It also requires that your database be completed. We assume you start from a database model and work your way up, and that's exactly how this framework is intended to be used. Once your database is in place, you can start generating code.&lt;br /&gt; &lt;br /&gt;When you get the templates, you'll find a Main.cst file in the root. That's the file you want to use for your initial generation. When you open it, you'll see a few properties that you need to set:&lt;br /&gt; &lt;br /&gt;&lt;ol&gt;
&lt;li&gt;&lt;b&gt;SourceDatabase&lt;/b&gt; - this is the database you want to generate against. You'll probably have to create a new connection to the database, which basically involves building a connection string and giving it a name. We use certain features that require SQL Server 2005, however, it will work with SQL Server Express.&lt;/li&gt;&lt;li&gt;&lt;b&gt;ExcludedTables&lt;/b&gt; - here you can exclude tables from having classes generated for them. If you have ASP.NET membership tables, you'll want to exclude those.&lt;/li&gt;&lt;li&gt;&lt;b&gt;TablePrefixes&lt;/b&gt; - this is a comma delimited list of prefixes to strip off tables for class names. For example, if all of your tables start with tbl, then the entity generated from tblOrders will be Order.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Namespace&lt;/b&gt; - This is the root namespace for the whole application. We typically use &amp;lt;CompanyName&amp;gt;.&amp;lt;ProductName&amp;gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;DomainNamespace&lt;/b&gt; - This is the namespace to add to the root namespace for your Domain / Business objects. We default to Business, but we've also used Domain and Core in the past. The resulting namespace for your business objects will be &amp;lt;Namespace&amp;gt;.&amp;lt;DomainNamespace&amp;gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;SQLType&lt;/b&gt; - We support both Stored Procedures and Dynamic SQL. You can choose either one. If you choose Stored Procedures, we'll generate a database project with all of the stored procedures used by the default framework implementation.&lt;/li&gt;&lt;li&gt;&lt;b&gt;OutputDirectory&lt;/b&gt; - The most important one! This is where you'll get your code when it's done.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;Once you have that done, just click Generate, sit back, and relax. In a few seconds, your framework will be ready to go.  A key concept to understand is that you can regenerate code as many times as you want.  Read about &lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=ActiveGeneration&amp;amp;referringTitle=GettingStarted"&gt;Active Generation&lt;/a&gt; in order to get the most productivity out of this framework.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=FixIssues&amp;amp;referringTitle=GettingStarted"&gt;Step 2: Fix Any Code Generation Issues&lt;/a&gt;
&lt;/h2&gt;&lt;h2&gt;
&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=CodeExamples&amp;amp;referringTitle=GettingStarted"&gt;Step 3: Write Code (including code samples)&lt;/a&gt;
&lt;/h2&gt;&lt;h2&gt;
&lt;a href="http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=AdvancedTopics&amp;amp;referringTitle=GettingStarted"&gt;Advanced Topics&lt;/a&gt;
&lt;/h2&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:45:57 GMT</pubDate><guid isPermaLink="false">Updated Wiki: GettingStarted 20080717014557A</guid></item><item><title>Updated Wiki: WhyTheNuSoftFramework</title><link>http://www.codeplex.com/kineticframework/Wiki/View.aspx?title=WhyTheNuSoftFramework&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Why The Kinetic Framework?
&lt;/h1&gt; &lt;br /&gt;Before the Kinetic Framework, just about every custom development project we got at RCM Technologies started with the tech lead developing some sort of framework that other team members can leverage when building the user interface. Getting that framework in place usually takes a while, and not much else can be done until at least a good chunk of it is in place. Not only that, but the framework is usually fairly routine once you make a few key decisions. It's the same type of code over and over again, which makes writing it by hand error-prone. Also, making the decisions about how to handle certain aspects takes time and usually has consequences that aren't always obvious when the decision is made. &lt;br /&gt; &lt;br /&gt;The end result is that projects usually take a week or two to get off the ground before other developers can really jump in and get going. It's this time that the Kinetic Framework is intended to help with. It also helps you by making a few of those key decisions. Why is that a good thing? Because the decisions are based on past project experience and frameworks that Kinetic IG at RCM Technologies has used in the past. It's a best of breed among a few different frameworks, extracted out to be quick and easy to start using.&lt;br /&gt; &lt;br /&gt;It's definitely not the only solution out there. If you've looked at .NetTiers (another CodeSmith template-based code generator framework) or some of the software factories being generated by Microsoft, you'll notice they all do pretty much the same type of thing.! While I think the Kinetic Framework is one of the best options, the point is, use something. In most cases, it's better than starting from scratch. I personally think both of the other solutions I listed are great and give you a lot of foundation - almost too much for smaller projects. And I think that the smaller niche is where the Kinetic Framework can fit in nicely.&lt;br /&gt; &lt;br /&gt;If you do decide to use it, don't feel that it has to be used &amp;quot;as is&amp;quot;. It's meant to be a set of templates that you can use to get a jumpstart on your project. If you don't like how something is implemented, you've got the full source so you can change it! Want a new feature in it for something you're doing? Add it! Want to remove something? Go for it.&lt;br /&gt; &lt;br /&gt;If you do modify the templates or find an issue, we'd like to know about not only the change, but also why you made the change. If it's a bug, we want to fix it. But more importantly, if it's a new feature, we want to see how we can incorporate that into future releases of the Kinetic Framework, so everyone can benefit from your experiences!&lt;br /&gt; &lt;br /&gt;The Kinetic Framework is being actively used at RCM Technologies, so we fully expect it to progress. We have a list of features we want to add, but we are definitely open to ideas from the community.&lt;br /&gt;
&lt;/div&gt;</description><author>RossCode</author><pubDate>Thu, 17 Jul 2008 01:39:01 GMT</pubDate><guid isPermaLink="false">Updated Wiki: WhyTheNuSoftFramework 20080717013901A</guid></item></channel></rss>