0

Rob Conery の Massive を使用しています。

メソッドList<DbCommand> BuildCommands(params object[] things)のコメントによると、メソッドは、「POCO、Anonymous、NameValueCollection、または 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 に答える