Home » Blog

rounded header

Using LightSpeed from VB

tag icon Tagged as LightSpeed

A 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

Data Products Visual Controls Community Store
LightSpeed ORM
NHibernate Designer
SimpleDB Tools
SharePoint Tools
WPF Elements
WPF Diagrams
Silverlight Elements
Forums
Blog
Register
Login
Subscribe to newsletter
Buy Now
My Account
Volume Discounts
Purchase Orders
Contact Us