Using LightSpeed from VB
Tagged as LightSpeedA nice feature of .NET is the great interop between components written in different languages. LightSpeed is no exception and can be used just as easily from VB.NET. Here is a simple example modeling the concept of a Task that has an associated Status.
First we declare the Status entity. The VB code is almost exactly the same as it’s C# equivalent – with one minor difference; we need to manually call the LightSpeed Initialize method from our constructor. This is due to a difference in when field initializers are run in VB. In VB field initializers are run after base class constructors. :-S
' Status Entity Imports Mindscape.LightSpeed Imports Mindscape.LightSpeed.Validation Public Class Status Inherits Entity(Of Integer) <ValidatePresence()> _ Private _statusName As String Private ReadOnly _tasks As New EntityCollection(Of Task)() ' Need to explicitly initialize in VB Public Sub New() MyBase.New(False) Initialize() End Sub Public Property StatusName() As String Get Return _statusName End Get Set(ByVal value As String) [Set](_statusName, value, "StatusName") End Set End Property Public ReadOnly Property Tasks() As EntityCollection(Of Task) Get Return [Get](_tasks) End Get End Property End Class
Next we can create the Task model:
' Task Entity Imports Mindscape.LightSpeed Public Class Task Inherits Entity(Of Integer) Private _statusId As Integer Private ReadOnly _status As New EntityHolder(Of Status)() ' Need to explicitly initialize in VB Public Sub New() MyBase.New(False) Initialize() End Sub Public Property Status() As Status Get Return [Get](_status) End Get Set(ByVal value As Status) [Set](_status, value) End Set End Property Public Property StatusId() As Integer Get Return _statusId End Get Set(ByVal value As Integer) [Set](_statusId, value, "StatusId") End Set End Property End Class
Our database schema will of course look something like this:
CREATE TABLE STATUS ( Id INT NOT NULL PRIMARY KEY IDENTITY, StatusName NVARCHAR(32) NOT NULL ) CREATE TABLE Task ( Id INT NOT NULL PRIMARY KEY IDENTITY, StatusId INT NOT NULL FOREIGN KEY REFERENCES STATUS(Id) ) GO INSERT INTO STATUS (StatusName) VALUES ('Completed') INSERT INTO Task(StatusId) VALUES (SCOPE_IDENTITY()) INSERT INTO STATUS (StatusName) VALUES ('Pending') INSERT INTO Task(StatusId) VALUES (SCOPE_IDENTITY())
Now we can go ahead and start using our model – In C# unit tests this time :-)
namespace Tests { [TestFixture] public class UnitTests { // initialize LightSpeed static UnitTests() { LightSpeedContext.ConnectionString = @"Data Source=ORMapper;Initial Catalog=LightSpeedVBExample;Integrated Security=SSPI"; LightSpeedContext.IdentityMethod = IdentityMethod.IdentityColumn; LightSpeedContext.Logger = new ConsoleLogger(); } // transactional tests - all database changes rolled back after test private TransactionScope _transactionScope; [SetUp] public void SetUp() { _transactionScope = new TransactionScope(); } [TearDown] public void TearDown() { Repository.CompleteUnitOfWork(false); _transactionScope.Dispose(); } // unit tests against model [Test] public void FindTasks() { IList<Task> tasks = Repository.Find<Task>(); Assert.AreEqual(2, tasks.Count); Task task = tasks[0]; Assert.IsNotNull(task); Assert.IsNotNull(task.Status); } [Test] public void FindStatuses() { IList<Status> statuses = Repository.Find<Status>(); Assert.AreEqual(2, statuses.Count); Status status = statuses[0]; Assert.IsNotNull(status); Assert.AreEqual(1, status.Tasks.Count); } [Test] public void NewTask() { Task task = new Task(); task.Status = Repository.FindOne<Status>( Entity.Attribute("StatusName") == "Pending"); Repository.Add(task); Repository.SaveChanges(); } [Test] public void NewStatus() { Status status = new Status(); status.StatusName = "New Status"; Repository.Add(status); Repository.SaveChanges(); } [Test] public void UpdateTask() { IList<Task> tasks = Repository.Find<Task>(); Task task = tasks[1]; Assert.AreEqual("Pending", task.Status.StatusName); task.Status = Repository.FindOne<Status>( Entity.Attribute("StatusName") == "Completed"); Repository.SaveChanges(); } [Test] public void UpdateStatus() { IList<Status> statuses = Repository.Find<Status>(); Status status = statuses[0]; Assert.AreEqual("Completed", status.StatusName); status.StatusName = "Complete!"; Repository.SaveChanges(); } [Test] public void DeleteTask() { IList<Task> tasks = Repository.Find<Task>(); Task task = tasks[1]; Repository.Remove(task); Repository.SaveChanges(); } [Test] public void DeleteStatus() { IList<Status> statuses = Repository.Find<Status>(); Status status = statuses[0]; Repository.Remove(status); Repository.SaveChanges(); } } }
Leave a Reply
Categories
BrainDump (1)
Community Code (4)
Events (16)
F# (14)
General (53)
Lab Samples (2)
LightSpeed (268)
MegaPack (8)
News (71)
NHibernate Designer (26)
Nightly news (52)
Phone Elements (24)
Products (87)
Projects (5)
Screencast (6)
SharePoint (3)
Silverlight (14)
Silverlight Elements (66)
SimpleDB Management Tools (20)
Visual Studio (9)
VS File Explorer (7)
Web Workbench (39)
WPF (44)
WPF Diagrams (57)
WPF Elements (110)
WPF Property Grid (32)



Posted by Andrew Peters on 22 August 2007 


