0

我正在使用 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.IDictionary2[System.String,System.Object]”的对象。

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

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

在我看来,在调用 CreateUpdateCommand 之前应该调用您的扩展方法 ToExpando?

4

1 回答 1

0

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

就是说 - 我相信如果您调用 myTable.Update() 或 myTable.Insert(),这将起作用。

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

于 2012-09-16T19:21:25.007 回答