Rob Conery的Massive中的BuildCommands参数

时间:2012-09-13 08:40:50

标签: orm massive

我正在使用Rob Conery的Massive。

根据方法注释,方法List<DbCommand> BuildCommands(params object[] things)应该采用“可以是POCO,Anonymous,NameValueCollections或Expandos”的对象。但是这个:

var x = new { Id = new Guid("0F66CDCF-C219-4510-B81A-674CE126DD8C"), Name = "x", DisplayName = "y" };

myTable.BuildCommands(x);

导致InvalidCastException。这是合理的,因为在Massive.cs中,尝试从传递的匿名类型转换为ExpandoObject。

为什么评论声明您可以传递任何内容?是否有其他方法可以从非ExpandoObjects构建命令?

以下是更多代码:

    public static void ThisFails()
    {
        DynamicModel myTable = new DynamicModel("myConnectionString", tableName: "dbo.MyTable", primaryKeyField: "Id");
        var updateMe = new { Id = new Guid("DF9A2F1B-3556-4EAC-BF2B-40E6821F3394"), Name = "abcx", DisplayName = "x" };
        var commands = myTable.BuildCommands(updateMe); // This fails
        myTable.Execute(commands);
    }

    public static void ThisSucceeds()
    {
        DynamicModel myTable = new DynamicModel("myConnectionString", tableName: "dbo.MyTable", primaryKeyField: "Id");
        dynamic updateMe = new ExpandoObject();
        updateMe.Id = new Guid("DF9A2F1B-3556-4EAC-BF2B-40E6821F3394");
        updateMe.Name = "abcx";
        updateMe.DisplayName = "x";
        var commands = myTable.BuildCommands(updateMe);
        myTable.Execute(commands);
    }

失败的代码导致:

  

无法投射类型的对象   '&LT;&GT; f__AnonymousType0 3[System.Guid,System.String,System.String]' to type <br/> 'System.Collections.Generic.IDictionary 2 [System.String,System.Object的]'。

它是从方法的第一行抛出的

public virtual DbCommand CreateUpdateCommand(dynamic expando, object key)
{
     var settings = (IDictionary<string, object>)expando;
     ...

对我来说,看起来在调用CreateUpdateCommand之前应该调用你的扩展方法ToExpando?

1 个答案:

答案 0 :(得分:0)

我认为这就是人们将方法设为私有和公共的原因:)。你不应该直接调用BuildCommands(虽然你在这里的代码仍然应该工作)。我觉得可能有一个错误在补丁中提交。

那就是说 - 如果你调用myTable.Update()或myTable.Insert(),我相信这会有效。

最后一部分回答了这个问题 - 就可能的“问题”而言 - 让我们把它带到Github。