在 OrmLite / Servicestack / Linqpad 中使用连接时值不能为空

Value cannot be null when using join in OrmLite / Servicestack / Linqpad

连接两个表时我得到 ArgumentNullException: Value cannot be null. Parameter name: key.

执行查询后会出现这种情况,更改 Linqpad 中的任意行并再次执行。

using (var db = _factory.OpenDbConnection())
{
    var q = db.From<Customer>()
    .Join<Customer, Address>();

    var results = db.SelectMulti<Customer, Address>(q); 

    results.Dump();
}

客户

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

地址

public class Address
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
}

ServiceStack 抛出这个错误

   at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
      at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
      at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
      at ServiceStack.TypeExtensions.GetActivator(ConstructorInfo ctor)
      at ServiceStack.OrmLite.OrmLiteUtils.ConvertToList[T](IDataReader reader, IOrmLiteDialectProvider dialectProvider, HashSet`1 onlyFields)
      at ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ExprConvertToList[T](IDbCommand dbCmd, String sql, IEnumerable`1 sqlParams, HashSet`1 onlyFields)
      at ServiceStack.OrmLite.ReadExpressionCommandExtensions.SelectMulti[T,T2](IDbCommand dbCmd, SqlExpression`1 q)
      at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter)
      at UserQuery.Main() in C:\Users\kairu\AppData\Local\Temp\LINQPad5\_uimlqbjb\plnhhb\LINQPadQuery.cs:line 54
      at LINQPad.ExecutionModel.ClrQueryRunner.Run()
      at LINQPad.ExecutionModel.Server.RunQuery(QueryRunner runner)
      at LINQPad.ExecutionModel.Server.StartQuery(QueryRunner runner)
      at LINQPad.ExecutionModel.Server.<>c__DisplayClass153_0.<ExecuteClrQuery>b__0()
      at LINQPad.ExecutionModel.Server.SingleThreadExecuter.Work()
      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
      at System.Threading.ThreadHelper.ThreadStart()

使用 ServiceStack 版本 5.1.0 net45

这个example works as expected on Gistlyn:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
}

db.CreateTable<Customer>();
db.CreateTable<Address>();
db.Insert(new Customer { Id = 1, Name = "C" });
db.Insert(new Address { Id = 1, CustomerId = 1 });


var q = db.From<Customer>()
    .Join<Customer,Address>();

var results = db.SelectMulti<Customer, Address>(q);

results.PrintDump();

这可能是 LINQ Pad 的问题。