admin管理员组

文章数量:1400744

Crossposting from here

I have a class called ModelSetWrapper which wraps model sets from an EfCore DbContext (Jet, specifically) and returns a dictionary containing the model set information. Here's what the class looks like:

namespace LibFacade.Utils;
public class ModelSetWrapper<T> where T : class
{
    private Dictionary<string, List<object>> _data;

    public ModelSetWrapper()
    {
        _data = new Dictionary<string, List<object>>();

        PropertyInfo[] properties = typeof(T).GetProperties();

        using (ModelContext context = new ModelContext())
        {
            DbSet<T> dbSet = context.Set<T>();

            foreach (PropertyInfo pInfo in properties)
            {
                List<object> list = dbSet.Select(c => pInfo.GetValue(c)).ToList();

                _data[pInfo.Name] = list;
            }
        }

    }

    public Dictionary<string, List<object>> Data => _data;
}

This seems to work fine from the .NET side. From a console app, the following runs without any errors:

ModelSetWrapper<Jaugeage> wrapper = new ModelSetWrapper<Jaugeage>();
foreach (KeyValuePair<string, List<object>> kvp in wrapper.Data)
{
    Console.WriteLine($"{kvp.Key}, {kvp.Value.Count}");
}

I'm able to load this assembly and types from it using pythonnet without any issues. However when I attempt the following in my python code:

wrapper = ModelSetWrapper[Jaugeage]()

I get an error:

---------------------------------------------------------------------------
InvalidOperationException                 Traceback (most recent call last)
Cell In[2], line 1
----> 1 wrapper = ModelSetWrapper[Jaugeage]()

InvalidOperationException: The  property can only be set once.
   at EntityFrameworkCore.Jet.Data.JetConnection.set_DataAccessProviderFactory(DbProviderFactory value)
   at EntityFrameworkCore.Jet.Data.JetConnection.Open()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.<>c.<MoveNext>b__21_0(DbContext _, Enumerator enumerator)
   at EntityFrameworkCore.Jet.Storage.Internal.JetExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at LibFacade.Utils.ModelSetWrapper`1..ctor() in [C:\Users\admin\Desktop\TEMP\projects\317\notebooks\Lib\LibFacade\ModelSetWrapper.cs](file:///C:/Users/admin/Desktop/TEMP/projects/317/notebooks/Lib/LibFacade/ModelSetWrapper.cs):line 12
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.MethodBaseInvoker.InvokeConstructorWithoutAlloc(Object obj, Boolean wrapInTargetInvocationException)

I have searched far an wide for a solution but don't really know how to start tackling this. Any pointers would be very welcome.

本文标签: cCannot load an EF Core db context wrapper in Python using PythonNETStack Overflow