Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 是否可以实现IDbSet<;T>;F#中的接口?_Entity Framework_F# - Fatal编程技术网

Entity framework 是否可以实现IDbSet<;T>;F#中的接口?

Entity framework 是否可以实现IDbSet<;T>;F#中的接口?,entity-framework,f#,Entity Framework,F#,我正在尝试对进行模拟实现,而我恰好是在F#中进行的 当我尝试使用示例F#签名时,会出现各种语法错误,这并不让我感到惊讶,因为该签名看起来甚至不像有效的F# 我真的不确定如何处理这些错误消息,或者如何编写约束以满足接口和F#编译器。我开始怀疑是否有可能用这种特殊的微软编程语言实现这种特殊的微软界面。欢迎任何建议。方法Create需要两个泛型类型参数之间的子类型约束。恐怕无法基于F#中的另一个子类型约束向泛型类型参数添加子类型约束。它们总是假定相等,请参见表单类型的新约束:>'b作为type='b再

我正在尝试对进行模拟实现,而我恰好是在F#中进行的

当我尝试使用示例F#签名时,会出现各种语法错误,这并不让我感到惊讶,因为该签名看起来甚至不像有效的F#


我真的不确定如何处理这些错误消息,或者如何编写约束以满足接口和F#编译器。我开始怀疑是否有可能用这种特殊的微软编程语言实现这种特殊的微软界面。欢迎任何建议。

方法
Create
需要两个泛型类型参数之间的子类型约束。恐怕无法基于F#中的另一个子类型约束向泛型类型参数添加子类型约束。它们总是假定相等,请参见表单类型的新约束:>'b作为type='b再次求解

请参阅与类似问题相关的内容


我们应该要求在下一个F#版本中加入该功能。

一开始我对此非常失望。在某些方面我仍然是,但在EF6中有一个解决方法。您可以继承
DbSet)=
继承数据库集(项目)
let query=data.AsQueryable()
new()=FakeDbSet(Seq.empty)
覆盖添加(项:'tenty)=数据添加(项);项目
覆盖_uuu.Remove(项:'tenty)=数据。移除(项)|>忽略;项目
覆盖附加(项:'tenty)=数据添加(项);项目
用
成员_uu.GetEnumerator()=数据.GetEnumerator():>System.Collections.Generic.IEnumerator
接口System.Collections.IEnumerable与
成员_uu.GetEnumerator()=数据.GetEnumerator():>System.Collections.IEnumerator
界面易读
成员u uu.Expression=query.Expression
成员_u.Provider=query.Provider

我不认为UserVoice建议是完全相关的-虽然裸约束是解决F#缺乏通用{co,contra}差异的一种方法,但它们确实是一种不同的功能,在不添加裸约束的情况下添加通用差异并不能解决此问题。@kvb我同意,这是相关的,但我们要么重新制定,要么单独提出建议。即使我们没有co/contra方差,我也希望能够添加这种约束。你认为呢?是的,在这里创建一个涵盖实际场景的新功能请求是绝对有意义的。这很少见,但有些库无法从F#使用,而且没有解决办法,这是一个巨大的痛苦。
type MockDbSet<'T when 'T : not struct>(items:seq<'T>) =
    let collection = ResizeArray(items)

    new () = MockDbSet(Seq.empty)

    interface IDbSet<'T> with
        member x.Add entity = collection.Add entity; entity
        member x.Attach entity = collection.Add entity; entity
        member x.Remove entity = collection.Remove entity |> ignore; entity
        member x.Create() = Unchecked.defaultof<'T>
        member x.Create<'TD when 'TD : not struct and 'TD :> 'T>() = Unchecked.defaultof<'TD>
        member x.Find([<ParamArray>] values) = raise <| NotImplementedException()
        member x.Local = Collections.ObjectModel.ObservableCollection(collection)

    interface System.Collections.Generic.IEnumerable<'T> with
        member x.GetEnumerator() = 
            collection.GetEnumerator() :> System.Collections.Generic.IEnumerator<_>

    interface System.Collections.IEnumerable with
        member x.GetEnumerator() =
            collection.GetEnumerator() :> System.Collections.IEnumerator

    interface IQueryable<'T> with
        member x.ElementType = typeof<'T>
        member x.Expression =
            collection.AsQueryable().Expression
        member x.Provider =
            collection.AsQueryable().Provider
member x.Create<'TD when 'TD : not struct and 'TD :> 'T>() = Unchecked.defaultof<'TD>
TDerivedEntity Create<TDerivedEntity>()
where TDerivedEntity : class, TEntity
abstract Create : unit -> 'TDerivedEntity  when 'TDerivedEntity : not struct and 'TEntity
type FakeDbSet<'TEntity when 'TEntity : not struct>(items: seq<'TEntity>) =
    inherit DbSet<'TEntity>()
    let data = ObservableCollection<'TEntity>(items)
    let query = data.AsQueryable()
    new() = FakeDbSet(Seq.empty)
    override __.Add(item: 'TEntity) = data.Add(item); item
    override __.Remove(item: 'TEntity) = data.Remove(item) |> ignore; item
    override __.Attach(item: 'TEntity) = data.Add(item); item
    override __.Create() = Activator.CreateInstance<'TEntity>()
    override __.Local with get() = data
    interface System.Collections.Generic.IEnumerable<'TEntity> with
        member __.GetEnumerator() = data.GetEnumerator() :> System.Collections.Generic.IEnumerator<_>
    interface System.Collections.IEnumerable with
        member __.GetEnumerator() = data.GetEnumerator() :> System.Collections.IEnumerator
    interface IQueryable<'TEntity> with
        member __.ElementType = typeof<'TEntity>
        member __.Expression = query.Expression
        member __.Provider = query.Provider