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

时间:2016-07-21 22:03:15

标签: entity-framework f# type-providers

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

我相信这是由于这个'参数(提供的属性的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)

...

// 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

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

0 个答案:

没有答案