我正在使用 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?