我正在使用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);
}
失败的代码导致:
无法投射类型的对象 '&LT;&GT; 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?
答案 0 :(得分:0)
我认为这就是人们将方法设为私有和公共的原因:)。你不应该直接调用BuildCommands(虽然你在这里的代码仍然应该工作)。我觉得可能有一个错误在补丁中提交。
那就是说 - 如果你调用myTable.Update()或myTable.Insert(),我相信这会有效。
最后一部分回答了这个问题 - 就可能的“问题”而言 - 让我们把它带到Github。