I have 2 tables as below:
Table: Orders
CREATE TABLE [dbo].[orders](
[id] [int] IDENTITY(1,1) NOT NULL,
[ticker] [char](5) NOT NULL,
[broker_id] [char](12) NOT NULL,
[type] [smallint] NOT NULL,
[quantity] [int] NOT NULL,
[price] [money] NOT NULL,
CONSTRAINT [PK_orders] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[orders] WITH CHECK ADD CONSTRAINT [FK_orders_quotes] FOREIGN KEY([ticker])
REFERENCES [dbo].[quotes] ([ticker])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[orders] CHECK CONSTRAINT [FK_orders_quotes]
GO
ALTER TABLE [dbo].[orders] WITH CHECK ADD CONSTRAINT [FK_orders_types] FOREIGN KEY([type])
REFERENCES [dbo].[order_types] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[orders] CHECK CONSTRAINT [FK_orders_types]
GO
ALTER TABLE [dbo].[orders] WITH CHECK ADD CONSTRAINT [FK_orders_users] FOREIGN KEY([broker_id])
REFERENCES [dbo].[users] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[orders] CHECK CONSTRAINT [FK_orders_users]
GO
Table: users
CREATE TABLE [dbo].[users](
[id] [char](12) NOT NULL,
[password] [varchar](60) NULL,
[first_name] [varchar](20) NULL,
[last_name] [varchar](20) NULL,
[email] [varchar](20) NULL,
[date_of_birth] [datetime] NULL,
[capital] [money] NULL,
[created_by] [varchar](12) NULL,
[created_date] [datetime] NULL,
CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[users] ADD DEFAULT ((0.0)) FOR [capital]
GO
And I have these 2 classes that map to the tables above:
Order
public class Order
{
public Order(string ticker, User user, OrderTypes type, int quantity, decimal price)
{
this.Ticker = ticker;
this.Broker = user;
this.Type = type;
this.Quantity = quantity;
this.Price = price;
}
public Order() { }
public string Ticker { get; private set; }
public OrderTypes Type { get; private set; }
public int Quantity { get; private set; }
public decimal Price { get; private set; }
public User Broker { get; private set; }
}
User
public class User
{
public User() { }
public User(string id, string firstName, string lastName, DateTime dateOfBirth, string email, decimal capital)
{
this.Id = id;
this.FirstName = firstName;
this.LastName = lastName;
this.DateOfBirth = dateOfBirth;
this.Email = email;
this.Capital = capital;
}
public User(string id, string firstName, string lastName, DateTime dateOfBirth, string email) : this(id, firstName, lastName, dateOfBirth, email, 0) { }
public string Id { get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
public DateTime DateOfBirth { get; private set; }
public string Email { get; private set; }
public decimal Capital { get; private set; }
}
Finally, I have these two lines of code:
db.Orders.Insert(id: 1, broker_id: "john.doe", quantity: 100);
Order order = db.Orders.Get(1);
The object order has the properties "Id" and "Quantity" populated, but the object "Broker" is null.
So I tried to retrieve the data like shown below, but still no luck: the Broker object is always NULL:
var order = db.Orders.FindAllById(1)
.Join(db.Users.As("Broker"), out user)
.On(Id: db.Orders.Broker_Id)
.With(user.As("Broker"))
.FirstOrDefault();
WITH __Data AS (SELECT [dbo].[orders].[id], ROW_NUMBER() OVER(ORDER BY [dbo].[orders].[id]) AS [_#_]
from [dbo].[orders] JOIN [dbo].[users] [Broker] ON ([Broker].[id] = [dbo].[orders].[broker_id]) WHERE [dbo].[orders].[id] = @p1)
SELECT [dbo].[orders].[id],[dbo].[orders].[ticker],[dbo].[orders].[broker_id],[dbo].[orders].[type],[dbo].[orders].[quantity],[dbo].[orders].[price],[Broker].[id] AS [__withn__Broker__id],[Broker].[password] AS [__withn__Broker__password],[Broker].[first_name] AS [__withn__Broker__first_name],[Broker].[last_name] AS [__withn__Broker__last_name],[Broker].[email] AS [__withn__Broker__email],[Broker].[date_of_birth] AS [__withn__Broker__date_of_birth],[Broker].[capital] AS [__withn__Broker__capital],[Broker].[created_by] AS [__withn__Broker__created_by],[Broker].[created_date] AS [__withn__Broker__created_date] FROM __Data JOIN [dbo].[orders] ON [dbo].[orders].[id] = __Data.[id] JOIN [dbo].[users] [Broker] ON ([Broker].[id] = [dbo].[orders].[broker_id]) WHERE [dbo].[orders].[id] = @p1 AND [_#_] BETWEEN 1 AND 1
Parameters:
@p1 (Int32) = 1
order = db.Orders.FindAllById(1)
.Join(db.Users.As("Broker"), out user)
.On(db.Orders.broker_id == user.Id)
.With(user)
.FirstOrDefault();
WITH __Data AS (SELECT [dbo].[orders].[id], ROW_NUMBER() OVER(ORDER BY [dbo].[orders].[id]) AS [_#_]
from [dbo].[orders] JOIN [dbo].[users] [Broker] ON ([dbo].[orders].[broker_id] = [Broker].[id]) WHERE [dbo].[orders].[id] = @p1)
SELECT [dbo].[orders].[id],[dbo].[orders].[ticker],[dbo].[orders].[broker_id],[dbo].[orders].[type],[dbo].[orders].[quantity],[dbo].[orders].[price],[Broker].[id] AS [__withn__Broker__id],[Broker].[password] AS [__withn__Broker__password],[Broker].[first_name] AS [__withn__Broker__first_name],[Broker].[last_name] AS [__withn__Broker__last_name],[Broker].[email] AS [__withn__Broker__email],[Broker].[date_of_birth] AS [__withn__Broker__date_of_birth],[Broker].[capital] AS [__withn__Broker__capital],[Broker].[created_by] AS [__withn__Broker__created_by],[Broker].[created_date] AS [__withn__Broker__created_date] FROM __Data JOIN [dbo].[orders] ON [dbo].[orders].[id] = __Data.[id] JOIN [dbo].[users] [Broker] ON ([dbo].[orders].[broker_id] = [Broker].[id]) WHERE [dbo].[orders].[id] = @p1 AND [_#_] BETWEEN 1 AND 1
Parameters:
@p1 (Int32) = 1
order = db.Orders.With(db.Users.As("Broker")).Get(1);
WITH __Data AS (SELECT [dbo].[orders].[id], ROW_NUMBER() OVER(ORDER BY [dbo].[orders].[id]) AS [_#_]
from [dbo].[orders] WHERE [dbo].[orders].[id] = @p1)
SELECT [dbo].[orders].[id],[dbo].[orders].[ticker],[dbo].[orders].[broker_id],[dbo].[orders].[type],[dbo].[orders].[quantity],[dbo].[orders].[price] FROM __Data JOIN [dbo].[orders] ON [dbo].[orders].[id] = __Data.[id] WHERE [dbo].[orders].[id] = @p1 AND [_#_] BETWEEN 1 AND 1
Parameters:
@p1 (Int32) = 1
Note: when assigning the order to a type of variable "var", the order does have the user information populated. So, if I do this:
var dynamicOrder = db.Orders.WithUser().Get(1);
the "dynamicOrder" is of type "Simple.Data.SimpleRecord" which has inside the following property "System.Collections.Generic.IDictionary.Values" that contains the "user" data inside.
So the issue appears to be with the casting of the user data to the user class.
Thoughts?