F#Erased Type Provider中派生提供的类型的实例类型不正确

Aar*_*ach 8 f# entity-framework type-providers

我正在研究几个F#类型提供程序来替换一些半生不熟的代码生成,并且我遇到了一些扩展基类型的提供类型的问题.例如,其中一个提供者是实体框架提供者,其中数据库模式的元数据来自外部源,我提供了一种使用DbContext作为其基本类型的类型.该类型具有访问各种DbSet <'table>成员的属性,但是当我尝试访问这些属性时,我收到错误Incorrect instance type. Parameter name: obj.

我相信这是由于'this'参数(所提供属性的GetterCode和SetterCode中的第一个参数)实际上是DbContext类型,而不是我提供的派生类型.这是有道理的,因为我的上下文类型的ProvideConstructor正在调用DbContext构造函数,但我不确定它还能做什么.我只能猜测我误解了关于如何创建类型的东西.我的类型定义,构造函数和属性的代码如下.如果我做错了,请告诉我.

let contextType = ProvidedTypeDefinition("MyContext", Some typeof<DbContext>)
let dbContextCtor = typeof<DbContext>.GetConstructor([|typeof<string>|])

let defaultCtor = // Use static parameter 'sqlConnection'
    ProvidedConstructor(List.Empty, 
        BaseConstructorCall = (fun args -> dbContextCtor, args), 
        InvokeCode = fun args -> Expr.NewObject(dbContextCtor, [ <@@ sqlConnection @@> ]))
let stringCtor = 
    ProvidedConstructor([ProvidedParameter("sqlConnection", typeof<string>)], 
        BaseConstructorCall = (fun args -> dbContextCtor, args), 
        InvokeCode = fun args -> Expr.NewObject(dbContextCtor, [ args.[1] ]))

contextType.AddMember(defaultCtor)
contextType.AddMember(stringCtor)
Run Code Online (Sandbox Code Playgroud)

...

// Add a DbSet field and property for each table to the context type
for providedType in providedTableTypes do
    let fieldType = typedefof<DbSet<_>>.MakeGenericType([|providedType|])
    let dbSetField = ProvidedField(sprintf "_%s" providedType.Name, fieldType)
    let dbSetProperty = 
        ProvidedProperty(providedType.Name, fieldType, 
            GetterCode = (fun args -> Expr.FieldGet(args.[0], dbSetField)),
            SetterCode = fun args -> Expr.FieldSet(args.[0], dbSetField, args.[1]))
    dbSetField.SetFieldAttributes(FieldAttributes.HasDefault)
    contextType.AddMember dbSetField
    contextType.AddMember dbSetProperty
Run Code Online (Sandbox Code Playgroud)

生成表类型并将DbSet属性添加到上下文类型,但是当我尝试访问其中一个属性时,我会在计算表达式Incorrect instance type时收到错误GetterCode.