Rob Conery's Massive 中的 BuildCommands 参数



我正在使用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);
    }

失败的代码导致:

无法强制转换类型为的对象'<>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?

我认为这就是人们将方法设为私有和公共的原因:)。您不应该直接调用BuildCommands(尽管这里的代码仍然可以工作)。我有一种感觉,补丁中可能存在错误。

话虽如此,但我相信如果您调用myTable.Update()或myTable.Insert().,这将起作用

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

最新更新