In an application I'm working on, I'm trying to write an IronPython script that
queries Azure Tables, returning a result into a class defined in Python. I
keep running into the following error when I do this:
Unhandled Exception: System.InvalidOperationException: The type
'IronPython.NewTypes.IPAzureTest.BaseModelClass_1$1' is not supported by the
client library. at System.Data.Services.Client.ClientType.Create(Type type,
Boolean expectModelType) at
System.Data.Services.Client.AtomMaterializer.ResolveByCreating(AtomEntry entry,
Type expectedEntryType) at
System.Data.Services.Client.AtomMaterializer.ResolveOrCreateInstance(AtomEntry
entry, Type expectedEntryType) at
System.Data.Services.Client.AtomMaterializerInvoker.DirectMaterializePlan(Object
materializer, Object entry, Type expectedEntryType) at
System.Data.Services.Client.ProjectionPlan.Run(AtomMaterializer materializer,
AtomEntry entry, Type expectedType) at
System.Data.Services.Client.AtomMaterializer.Read() at
System.Data.Services.Client.MaterializeAtom.MoveNextInternal() at
System.Data.Services.Client.MaterializeAtom.MoveNext() at
System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext() at
System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) at
System.Data.Services.Client.DataServiceQueryProvider.ReturnSingleton[TElement](Expression
expression) at
System.Data.Services.Client.DataServiceQueryProvider.Execute[TResult](Expression
expression) at System.Linq.Queryable.Single[TSource](IQueryable`1 source)
at Microsoft.Scripting.Interpreter.FuncCallInstruction`2.Run(InterpretedFrame
frame) at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame
frame) at Microsoft.Scripting.Interpreter.LightLambda.Run3[T0,T1,T2,TRet](T0
arg0, T1 arg1, T2 arg2) at
System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0
arg0, T1 arg1) at
Microsoft.Scripting.Interpreter.DynamicInstruction`3.Run(InterpretedFrame
frame) at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame
frame) at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0
arg0, T1 arg1) at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext
ctx) at IronPython.Compiler.PythonScriptCode.Run(Scope scope) at
IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope) at
IronPython.Compiler.RuntimeScriptCode.Run(Scope scope) at
Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink) at
Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope) at
IPAzureTest.IPScriptHost.RunEdit() in
d:\Development\Utilities\IPAzureTest\IPAzureTest\IPScriptHost.cs:line 31 at
IPAzureTest.Program.Main(String[] args) in
d:\Development\Utilities\IPAzureTest\IPAzureTest\Program.cs:line 12
If I define the model class in C#, I do not run into this issue. The data I'm
working with changes often. Being able to define the model in Python will make
it so new builds are not necessary when additional tables are added.
Here is what my python script looks like:
import clrimport
Systemclr.AddReference("System.Core")clr.ImportExtensions(System.Linq)
class MyTable(AzureTableService.BaseModelClass): def __new__(self,
partitionKey, rowKey): self.PartitionKey = partitionKey
self.RowKey = rowKey return super.__new__(self)
MyTableDetails = "";
y = AzureTableService.GetAzureTableQuery[MyTable]("MyTable")z = y.Where(lambda
c: c.PartitionKey == "10" and c.RowKey == "10040").Single()
print(z.MyTableDetails)
And my C# Code:
public class AzureTableService {
private CloudStorageAccount mStorageAccount;
public AzureTableService() {
CloudStorageAccount.SetConfigurationSettingPublisher((configName,
configSetter) => {
var connectionString =
ConfigurationManager.AppSettings[configName];
configSetter(connectionString);
});
mStorageAccount =
CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
}
private TableServiceContext AzureTableServiceContext {
get {
var context =
mStorageAccount.CreateCloudTableClient().GetDataServiceContext();
context.IgnoreResourceNotFoundException = true;
return context;
}
}
public IQueryable<T> GetAzureTableQuery<T>(string TableName) {
return AzureTableServiceContext.CreateQuery<T>(TableName);
}
public class BaseModelClass : TableServiceEntity {
public BaseModelClass(string partitionKey, string rowKey) :
base(partitionKey, rowKey) { }
public BaseModelClass() : base(Guid.NewGuid().ToString(),
String.Empty) { }
}
public class MyTable : TableServiceEntity {
public MyTable(string partitionKey, string rowKey) :
base(partitionKey, rowKey) { }
public MyTable() : base(Guid.NewGuid().ToString(), String.Empty) { }
public string FeeScheduleDetails { get; set; }
}
}
If I use MyTable define in C#, it works fine. By using the one defined in
Python throws the exception. Can anyone point me in the right direction?
_______________________________________________
Ironpython-users mailing list
[email protected]
http://mail.python.org/mailman/listinfo/ironpython-users