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.IDictionary
2[System.String,System.Object]' のオブジェクトをキャストできません。
メソッドの最初の行からスローされます
public virtual DbCommand CreateUpdateCommand(dynamic expando, object key)
{
var settings = (IDictionary<string, object>)expando;
...
CreateUpdateCommand が呼び出される前に、拡張メソッド ToExpando を呼び出す必要があるように見えますか?